diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..cf4d3f8ac1ee2c37659877ab3276c0666b1a0672
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,16 @@
+
+FROM python:3.9
+
+WORKDIR /code
+
+COPY --link --chown=1000 . .
+
+RUN mkdir -p /tmp/cache/
+RUN chmod a+rwx -R /tmp/cache/
+ENV TRANSFORMERS_CACHE=/tmp/cache/
+
+RUN pip install --no-cache-dir -r requirements.txt
+
+ENV PYTHONUNBUFFERED=1 GRADIO_ALLOW_FLAGGING=never GRADIO_NUM_PORTS=1 GRADIO_SERVER_NAME=0.0.0.0 GRADIO_SERVER_PORT=7860 SYSTEM=spaces
+
+CMD ["python", "space.py"]
diff --git a/README.md b/README.md
index 1a0d4a5c98de8f7b63b88482359210ad0215bc7b..57de087c98e08e5a7fc45b1b34d7baf27c323ac2 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,17 @@
+
---
-title: Gradio Awsbr Mmchatbot
-emoji: 🏢
-colorFrom: pink
-colorTo: pink
+tags: [gradio-custom-component,gradio-template-Chatbot,AWS,Bedrock,Amazon Bedrock,Anthropic,LLM,Chatbot,Multimodal,Claude,Claude v3]
+title: gradio_awsbr_mmchatbot V0.0.2
+colorFrom: blue
+colorTo: red
sdk: docker
pinned: false
+license: apache-2.0
---
-Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
+
+# Name: gradio_awsbr_mmchatbot
+
+Description: This component enables multi-modal input for the Anthropic Claude v3 suite of models available from Amazon Bedrock
+
+Install with: pip install gradio_awsbr_mmchatbot
\ No newline at end of file
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/__pycache__/__init__.cpython-310.pyc b/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5f33a07e5fa49d1afcd33db0f7b61ee4a4987ac5
Binary files /dev/null and b/__pycache__/__init__.cpython-310.pyc differ
diff --git a/__pycache__/app.cpython-310.pyc b/__pycache__/app.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5088047f68851737d8d10af256cfddea8429915b
Binary files /dev/null and b/__pycache__/app.cpython-310.pyc differ
diff --git a/__pycache__/bedrock_utils.cpython-310.pyc b/__pycache__/bedrock_utils.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cf5848b43a9a69b1e77b9f3e42a2fad9ed6f4130
Binary files /dev/null and b/__pycache__/bedrock_utils.cpython-310.pyc differ
diff --git a/app.py b/app.py
new file mode 100644
index 0000000000000000000000000000000000000000..6a8bfebd73648b75e58f7ba15443d08e117ab2b2
--- /dev/null
+++ b/app.py
@@ -0,0 +1,61 @@
+import gradio as gr
+from gradio_awsbr_mmchatbot import MultiModalChatbot
+from gradio.data_classes import FileData
+from bedrock_utils import MultimodalInputHandler
+
+
+# A function to call the multi-modal input for Anthropic Claude v3 sonnet using Bedrock boto3
+async def get_response(text, file):
+ # If there is a file uploaded, then we will send it to Anthropic Claude v3 sonnet.
+ # If there is no file uploaded, then we will send the text to Anthropic Claude v3 sonnet.
+ try:
+ userMsg = {
+ "text": text,
+ "files": [{"file": FileData(path=file)}]
+ }
+ except:
+ userMsg = {
+ "text": text,
+ "files": []
+ }
+ # Define a variable to store the response from the Anthropic Claude v3 sonnet
+ llmResponse = ""
+ handler = MultimodalInputHandler(text, file)
+ # Loop through the response from Anthropic Claude v3 sonnet, and append it to our llmResponse variable.
+ async for x in handler.handleInput():
+ llmResponse += x
+ yield [[userMsg, {"text": llmResponse, "files": []}]]
+ # Yield the response from Anthropic Claude v3 sonnet. This is unecessary as we can just yield the llmResponse variable in an iterative fashion as above.
+ # But just in case.... let's yield the entire response object as well and overwrite the messages in the Chatbot.
+ response = {
+ "text": llmResponse,
+ "files": []
+ }
+ yield [[userMsg, response]]
+
+# Defining Gradio Interface using Blocks Structure
+with gr.Blocks() as demo:
+ # Give it a Title
+ gr.Markdown("## Gradio - MultiModal Chatbot")
+ # Define the Chat Tab
+ with gr.Tab(label="Chat"):
+ with gr.Row():
+ with gr.Column(scale=3):
+ # Set a variable equal to our MultiModalChatBot class
+ chatBot = MultiModalChatbot(height=700, render_markdown=True, bubble_full_width=True)
+ with gr.Row():
+ with gr.Column(scale=3):
+ # Set a variable equal to our user message
+ msg = gr.Textbox(placeholder='What is the meaning of life?', show_label=False)
+ with gr.Column(scale=1):
+ # Set a variable equal to our file upload
+ fileInput = gr.File(label="Upload Files")
+ with gr.Column(scale=1):
+ # Define our submit button and invoke our 'get_response' function when it's clicked.
+ gr.Button('Submit', variant='primary').click(get_response, inputs=[msg,fileInput], outputs=chatBot)
+ # Same function as above, but with the 'enter' key being pressed inside the gr.Textbox() component instead of the 'submit' button.
+ msg.submit(get_response, inputs=[msg, fileInput], outputs=chatBot)
+
+
+if __name__ == '__main__':
+ demo.queue().launch()
\ No newline at end of file
diff --git a/bedrock_utils.py b/bedrock_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..06eae30a32649a374487165958bed7276dce8832
--- /dev/null
+++ b/bedrock_utils.py
@@ -0,0 +1,70 @@
+import json
+import base64
+import os
+from anthropic import AnthropicBedrock
+from PIL import Image
+
+class MultimodalInputHandler:
+ def __init__(self, text, image=None):
+ self.text = text
+ self.image = image
+
+ self.client = AnthropicBedrock(
+ aws_region='us-west-2'
+ )
+
+ async def handleInput(self):
+ if self.image:
+
+ # Determine the format of the image
+ if self.image.endswith(".jpg"):
+ formatType = "image/jpeg"
+ elif self.image.endswith(".png"):
+ formatType = "image/png"
+ elif self.image.endswith(".gif"):
+ formatType = "image/gif"
+ elif self.image.endswith(".webp"):
+ formatType = "image/webp"
+
+ # Encode the image as base64
+ b64EncodedImage = base64.b64encode(open(self.image, "rb").read())
+
+ # Send the image and text to the Anthropic API
+ with self.client.messages.stream(
+ model="anthropic.claude-3-sonnet-20240229-v1:0",
+ max_tokens=5000,
+ messages=[{
+ 'role': 'user',
+ 'content': [
+ {
+ "type": "image",
+ "source": {
+ "type": "base64",
+ "media_type": formatType,
+ "data": b64EncodedImage.decode("utf-8")
+ }
+ },
+ {
+ "type": "text",
+ "text": self.text
+ }
+ ]
+ }]
+ ) as stream:
+ for text in stream.text_stream:
+ yield text
+ else:
+ # Send the text to the Anthropic API
+ with self.client.messages.stream(
+ model="anthropic.claude-3-sonnet-20240229-v1:0",
+ max_tokens=5000,
+ messages=[{
+ 'role': 'user',
+ 'content': self.text
+ }]
+ ) as stream:
+ for text in stream.text_stream:
+ yield text
+
+# MultimodalInputHandler = MultimodalInputHandler("What is this image?", "path/to/my/file")
+# print(MultimodalInputHandler.handleInput())
\ No newline at end of file
diff --git a/css.css b/css.css
new file mode 100644
index 0000000000000000000000000000000000000000..f7256be42f9884d89b499b0f5a6cfcbed3d54c80
--- /dev/null
+++ b/css.css
@@ -0,0 +1,157 @@
+html {
+ font-family: Inter;
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 1.5;
+ -webkit-text-size-adjust: 100%;
+ background: #fff;
+ color: #323232;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ text-rendering: optimizeLegibility;
+}
+
+:root {
+ --space: 1;
+ --vspace: calc(var(--space) * 1rem);
+ --vspace-0: calc(3 * var(--space) * 1rem);
+ --vspace-1: calc(2 * var(--space) * 1rem);
+ --vspace-2: calc(1.5 * var(--space) * 1rem);
+ --vspace-3: calc(0.5 * var(--space) * 1rem);
+}
+
+.app {
+ max-width: 748px !important;
+}
+
+.prose p {
+ margin: var(--vspace) 0;
+ line-height: var(--vspace * 2);
+ font-size: 1rem;
+}
+
+code {
+ font-family: "Inconsolata", sans-serif;
+ font-size: 16px;
+}
+
+h1,
+h1 code {
+ font-weight: 400;
+ line-height: calc(2.5 / var(--space) * var(--vspace));
+}
+
+h1 code {
+ background: none;
+ border: none;
+ letter-spacing: 0.05em;
+ padding-bottom: 5px;
+ position: relative;
+ padding: 0;
+}
+
+h2 {
+ margin: var(--vspace-1) 0 var(--vspace-2) 0;
+ line-height: 1em;
+}
+
+h3,
+h3 code {
+ margin: var(--vspace-1) 0 var(--vspace-2) 0;
+ line-height: 1em;
+}
+
+h4,
+h5,
+h6 {
+ margin: var(--vspace-3) 0 var(--vspace-3) 0;
+ line-height: var(--vspace);
+}
+
+.bigtitle,
+h1,
+h1 code {
+ font-size: calc(8px * 4.5);
+ word-break: break-word;
+}
+
+.title,
+h2,
+h2 code {
+ font-size: calc(8px * 3.375);
+ font-weight: lighter;
+ word-break: break-word;
+ border: none;
+ background: none;
+}
+
+.subheading1,
+h3,
+h3 code {
+ font-size: calc(8px * 1.8);
+ font-weight: 600;
+ border: none;
+ background: none;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+}
+
+h2 code {
+ padding: 0;
+ position: relative;
+ letter-spacing: 0.05em;
+}
+
+blockquote {
+ font-size: calc(8px * 1.1667);
+ font-style: italic;
+ line-height: calc(1.1667 * var(--vspace));
+ margin: var(--vspace-2) var(--vspace-2);
+}
+
+.subheading2,
+h4 {
+ font-size: calc(8px * 1.4292);
+ text-transform: uppercase;
+ font-weight: 600;
+}
+
+.subheading3,
+h5 {
+ font-size: calc(8px * 1.2917);
+ line-height: calc(1.2917 * var(--vspace));
+
+ font-weight: lighter;
+ text-transform: uppercase;
+ letter-spacing: 0.15em;
+}
+
+h6 {
+ font-size: calc(8px * 1.1667);
+ font-size: 1.1667em;
+ font-weight: normal;
+ font-style: italic;
+ font-family: "le-monde-livre-classic-byol", serif !important;
+ letter-spacing: 0px !important;
+}
+
+#start .md > *:first-child {
+ margin-top: 0;
+}
+
+h2 + h3 {
+ margin-top: 0;
+}
+
+.md hr {
+ border: none;
+ border-top: 1px solid var(--block-border-color);
+ margin: var(--vspace-2) 0 var(--vspace-2) 0;
+}
+.prose ul {
+ margin: var(--vspace-2) 0 var(--vspace-1) 0;
+}
+
+.gap {
+ gap: 0;
+}
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b700d8b0daa33c48ffbd65f437270aed0719589f
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1 @@
+gradio_awsbr_mmchatbot==0.0.1
\ No newline at end of file
diff --git a/space.py b/space.py
new file mode 100644
index 0000000000000000000000000000000000000000..d760cce3271b3373d0e42aeeebb4a37f47a959f4
--- /dev/null
+++ b/space.py
@@ -0,0 +1,204 @@
+
+import gradio as gr
+from app import demo as app
+import os
+
+_docs = {'MultiModalChatbot': {'description': 'Creates a chatbot that displays user-submitted messages and responses. Supports a subset of Markdown including bold, italics, code, tables.\nAlso supports audio/video/image files, which are displayed in the MultiModalChatbot, and other kinds of files which are displayed as links. This\ncomponent is usually used as an output component.\n', 'members': {'__init__': {'value': {'type': 'list[\n list[\n str\n | tuple[str]\n | tuple[str | pathlib.Path, str]\n | None\n ]\n ]\n | Callable\n | None', 'default': 'None', 'description': 'Default value to show in chatbot. If callable, the function will be called whenever the app loads to set the initial value of the component.'}, 'label': {'type': 'str | None', 'default': 'None', 'description': 'The label for this component. Appears above the component and is also used as the header if there are a table of examples for this component. If None and used in a `gr.Interface`, the label will be the name of the parameter this component is assigned to.'}, 'every': {'type': 'float | None', 'default': 'None', 'description': "If `value` is a callable, run the function 'every' number of seconds while the client connection is open. Has no effect otherwise. The event can be accessed (e.g. to cancel it) via this component's .load_event attribute."}, 'show_label': {'type': 'bool | None', 'default': 'None', 'description': 'if True, will display label.'}, 'container': {'type': 'bool', 'default': 'True', 'description': 'If True, will place the component in a container - providing some extra padding around the border.'}, 'scale': {'type': 'int | None', 'default': 'None', 'description': 'relative size compared to adjacent Components. For example if Components A and B are in a Row, and A has scale=2, and B has scale=1, A will be twice as wide as B. Should be an integer. scale applies in Rows, and to top-level Components in Blocks where fill_height=True.'}, 'min_width': {'type': 'int', 'default': '160', 'description': 'minimum pixel width, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in this Component being narrower than min_width, the min_width parameter will be respected first.'}, 'visible': {'type': 'bool', 'default': 'True', 'description': 'If False, component will be hidden.'}, 'elem_id': {'type': 'str | None', 'default': 'None', 'description': 'An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'elem_classes': {'type': 'list[str] | str | None', 'default': 'None', 'description': 'An optional list of strings that are assigned as the classes of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'render': {'type': 'bool', 'default': 'True', 'description': 'If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.'}, 'height': {'type': 'int | str | None', 'default': 'None', 'description': 'The height of the component, specified in pixels if a number is passed, or in CSS units if a string is passed.'}, 'latex_delimiters': {'type': 'list[dict[str, str | bool]] | None', 'default': 'None', 'description': 'A list of dicts of the form {"left": open delimiter (str), "right": close delimiter (str), "display": whether to display in newline (bool)} that will be used to render LaTeX expressions. If not provided, `latex_delimiters` is set to `[{ "left": "$$", "right": "$$", "display": True }]`, so only expressions enclosed in $$ delimiters will be rendered as LaTeX, and in a new line. Pass in an empty list to disable LaTeX rendering. For more information, see the [KaTeX documentation](https://katex.org/docs/autorender.html).'}, 'rtl': {'type': 'bool', 'default': 'False', 'description': 'If True, sets the direction of the rendered text to right-to-left. Default is False, which renders text left-to-right.'}, 'show_share_button': {'type': 'bool | None', 'default': 'None', 'description': 'If True, will show a share icon in the corner of the component that allows user to share outputs to Hugging Face Spaces Discussions. If False, icon does not appear. If set to None (default behavior), then the icon appears if this Gradio app is launched on Spaces, but not otherwise.'}, 'show_copy_button': {'type': 'bool', 'default': 'False', 'description': 'If True, will show a copy button for each chatbot message.'}, 'avatar_images': {'type': 'tuple[\n str | pathlib.Path | None, str | pathlib.Path | None\n ]\n | None', 'default': 'None', 'description': 'Tuple of two avatar image paths or URLs for user and bot (in that order). Pass None for either the user or bot image to skip. Must be within the working directory of the Gradio app or an external URL.'}, 'sanitize_html': {'type': 'bool', 'default': 'True', 'description': 'If False, will disable HTML sanitization for chatbot messages. This is not recommended, as it can lead to security vulnerabilities.'}, 'render_markdown': {'type': 'bool', 'default': 'True', 'description': 'If False, will disable Markdown rendering for chatbot messages.'}, 'bubble_full_width': {'type': 'bool', 'default': 'True', 'description': 'If False, the chat bubble will fit to the content of the message. If True (default), the chat bubble will be the full width of the component.'}, 'line_breaks': {'type': 'bool', 'default': 'True', 'description': 'If True (default), will enable Github-flavored Markdown line breaks in chatbot messages. If False, single new lines will be ignored. Only applies if `render_markdown` is True.'}, 'likeable': {'type': 'bool', 'default': 'False', 'description': 'Whether the chat messages display a like or dislike button. Set automatically by the .like method but has to be present in the signature for it to show up in the config.'}, 'layout': {'type': '"panel" | "bubble" | None', 'default': 'None', 'description': 'If "panel", will display the chatbot in a llm style layout. If "bubble", will display the chatbot with message bubbles, with the user and bot messages on alterating sides. Will default to "bubble".'}}, 'postprocess': {'value': {'type': 'list[\n list[str | tuple[str] | tuple[str, str] | None]\n | tuple\n ]\n | None', 'description': 'expects a `list[list[str | None | tuple]]`, i.e. a list of lists. The inner list should have 2 elements: the user message and the response message. The individual messages can be (1) strings in valid Markdown, (2) tuples if sending files: (a filepath or URL to a file, [optional string alt text]) -- if the file is image/video/audio, it is displayed in the MultiModalChatbot, or (3) None, in which case the message is not displayed.'}}, 'preprocess': {'return': {'type': 'list[MultimodalMessage] | None', 'description': "The preprocessed input data sent to the user's function in the backend."}, 'value': None}}, 'events': {'change': {'type': None, 'default': None, 'description': 'Triggered when the value of the MultiModalChatbot changes either because of user input (e.g. a user types in a textbox) OR because of a function update (e.g. an image receives a value from the output of an event trigger). See `.input()` for a listener that is only triggered by user input.'}, 'select': {'type': None, 'default': None, 'description': 'Event listener for when the user selects or deselects the MultiModalChatbot. Uses event data gradio.SelectData to carry `value` referring to the label of the MultiModalChatbot, and `selected` to refer to state of the MultiModalChatbot. See EventData documentation on how to use this event data'}, 'like': {'type': None, 'default': None, 'description': 'This listener is triggered when the user likes/dislikes from within the MultiModalChatbot. This event has EventData of type gradio.LikeData that carries information, accessible through LikeData.index and LikeData.value. See EventData documentation on how to use this event data.'}}}, '__meta__': {'additional_interfaces': {'MultimodalMessage': {'source': 'class MultimodalMessage(GradioModel):\n text: Optional[str] = None\n files: Optional[List[FileMessage]] = None', 'refs': ['FileMessage']}, 'FileMessage': {'source': 'class FileMessage(GradioModel):\n file: FileData\n alt_text: Optional[str] = None'}}, 'user_fn_refs': {'MultiModalChatbot': ['MultimodalMessage']}}}
+
+abs_path = os.path.join(os.path.dirname(__file__), "css.css")
+
+with gr.Blocks(
+ css=abs_path,
+ theme=gr.themes.Default(
+ font_mono=[
+ gr.themes.GoogleFont("Inconsolata"),
+ "monospace",
+ ],
+ ),
+) as demo:
+ gr.Markdown(
+"""
+# `gradio_awsbr_mmchatbot`
+
+
+
+
+
+This component enables multi-modal input for the Anthropic Claude v3 suite of models available from Amazon Bedrock
+""", elem_classes=["md-custom"], header_links=True)
+ app.render()
+ gr.Markdown(
+"""
+## Installation
+
+```bash
+pip install gradio_awsbr_mmchatbot
+```
+
+## Usage
+
+```python
+import gradio as gr
+from gradio_awsbr_mmchatbot import MultiModalChatbot
+from gradio.data_classes import FileData
+from bedrock_utils import MultimodalInputHandler
+
+
+# A function to call the multi-modal input for Anthropic Claude v3 sonnet using Bedrock boto3
+async def get_response(text, file):
+ # If there is a file uploaded, then we will send it to Anthropic Claude v3 sonnet.
+ # If there is no file uploaded, then we will send the text to Anthropic Claude v3 sonnet.
+ try:
+ userMsg = {
+ "text": text,
+ "files": [{"file": FileData(path=file)}]
+ }
+ except:
+ userMsg = {
+ "text": text,
+ "files": []
+ }
+ # Define a variable to store the response from the Anthropic Claude v3 sonnet
+ llmResponse = ""
+ handler = MultimodalInputHandler(text, file)
+ # Loop through the response from Anthropic Claude v3 sonnet, and append it to our llmResponse variable.
+ async for x in handler.handleInput():
+ llmResponse += x
+ yield [[userMsg, {"text": llmResponse, "files": []}]]
+ # Yield the response from Anthropic Claude v3 sonnet. This is unecessary as we can just yield the llmResponse variable in an iterative fashion as above.
+ # But just in case.... let's yield the entire response object as well and overwrite the messages in the Chatbot.
+ response = {
+ "text": llmResponse,
+ "files": []
+ }
+ yield [[userMsg, response]]
+
+# Defining Gradio Interface using Blocks Structure
+with gr.Blocks() as demo:
+ # Give it a Title
+ gr.Markdown("## Gradio - MultiModal Chatbot")
+ # Define the Chat Tab
+ with gr.Tab(label="Chat"):
+ with gr.Row():
+ with gr.Column(scale=3):
+ # Set a variable equal to our MultiModalChatBot class
+ chatBot = MultiModalChatbot(height=700, render_markdown=True, bubble_full_width=True)
+ with gr.Row():
+ with gr.Column(scale=3):
+ # Set a variable equal to our user message
+ msg = gr.Textbox(placeholder='What is the meaning of life?', show_label=False)
+ with gr.Column(scale=1):
+ # Set a variable equal to our file upload
+ fileInput = gr.File(label="Upload Files")
+ with gr.Column(scale=1):
+ # Define our submit button and invoke our 'get_response' function when it's clicked.
+ gr.Button('Submit', variant='primary').click(get_response, inputs=[msg,fileInput], outputs=chatBot)
+ # Same function as above, but with the 'enter' key being pressed inside the gr.Textbox() component instead of the 'submit' button.
+ msg.submit(get_response, inputs=[msg, fileInput], outputs=chatBot)
+
+
+if __name__ == '__main__':
+ demo.queue().launch()
+```
+""", elem_classes=["md-custom"], header_links=True)
+
+
+ gr.Markdown("""
+## `MultiModalChatbot`
+
+### Initialization
+""", elem_classes=["md-custom"], header_links=True)
+
+ gr.ParamViewer(value=_docs["MultiModalChatbot"]["members"]["__init__"], linkify=['MultimodalMessage', 'FileMessage'])
+
+
+ gr.Markdown("### Events")
+ gr.ParamViewer(value=_docs["MultiModalChatbot"]["events"], linkify=['Event'])
+
+
+
+
+ gr.Markdown("""
+
+### User function
+
+The impact on the users predict function varies depending on whether the component is used as an input or output for an event (or both).
+
+- When used as an Input, the component only impacts the input signature of the user function.
+- When used as an output, the component only impacts the return signature of the user function.
+
+The code snippet below is accurate in cases where the component is used as both an input and an output.
+
+- **As input:** Is passed, the preprocessed input data sent to the user's function in the backend.
+- **As output:** Should return, expects a `list[list[str | None | tuple]]`, i.e. a list of lists. The inner list should have 2 elements: the user message and the response message. The individual messages can be (1) strings in valid Markdown, (2) tuples if sending files: (a filepath or URL to a file, [optional string alt text]) -- if the file is image/video/audio, it is displayed in the MultiModalChatbot, or (3) None, in which case the message is not displayed.
+
+ ```python
+def predict(
+ value: list[MultimodalMessage] | None
+) -> list[
+ list[str | tuple[str] | tuple[str, str] | None]
+ | tuple
+ ]
+ | None:
+ return value
+```
+""", elem_classes=["md-custom", "MultiModalChatbot-user-fn"], header_links=True)
+
+
+
+
+ code_MultimodalMessage = gr.Markdown("""
+## `MultimodalMessage`
+```python
+class MultimodalMessage(GradioModel):
+ text: Optional[str] = None
+ files: Optional[List[FileMessage]] = None
+```""", elem_classes=["md-custom", "MultimodalMessage"], header_links=True)
+
+ code_FileMessage = gr.Markdown("""
+## `FileMessage`
+```python
+class FileMessage(GradioModel):
+ file: FileData
+ alt_text: Optional[str] = None
+```""", elem_classes=["md-custom", "FileMessage"], header_links=True)
+
+ demo.load(None, js=r"""function() {
+ const refs = {
+ MultimodalMessage: ['FileMessage'],
+ FileMessage: [], };
+ const user_fn_refs = {
+ MultiModalChatbot: ['MultimodalMessage'], };
+ requestAnimationFrame(() => {
+
+ Object.entries(user_fn_refs).forEach(([key, refs]) => {
+ if (refs.length > 0) {
+ const el = document.querySelector(`.${key}-user-fn`);
+ if (!el) return;
+ refs.forEach(ref => {
+ el.innerHTML = el.innerHTML.replace(
+ new RegExp("\\b"+ref+"\\b", "g"),
+ `${ref} `
+ );
+ })
+ }
+ })
+
+ Object.entries(refs).forEach(([key, refs]) => {
+ if (refs.length > 0) {
+ const el = document.querySelector(`.${key}`);
+ if (!el) return;
+ refs.forEach(ref => {
+ el.innerHTML = el.innerHTML.replace(
+ new RegExp("\\b"+ref+"\\b", "g"),
+ `${ref} `
+ );
+ })
+ }
+ })
+ })
+}
+
+""")
+
+demo.launch()
diff --git a/src/.DS_Store b/src/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..c88a062b05be4fd1d362b3e4c6a7481e718b69d0
Binary files /dev/null and b/src/.DS_Store differ
diff --git a/src/.gitignore b/src/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..60188eefb61faf29c12a14228941da079044292f
--- /dev/null
+++ b/src/.gitignore
@@ -0,0 +1,9 @@
+.eggs/
+dist/
+*.pyc
+__pycache__/
+*.py[cod]
+*$py.class
+__tmp/*
+*.pyi
+node_modules
\ No newline at end of file
diff --git a/src/README.md b/src/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..878c460bf8a560843493bc56eb6bac102893887e
--- /dev/null
+++ b/src/README.md
@@ -0,0 +1,452 @@
+
+# `gradio_awsbr_mmchatbot`
+
+
+This component enables multi-modal input for the Anthropic Claude v3 suite of models available from Amazon Bedrock
+
+## Installation
+
+```bash
+pip install gradio_awsbr_mmchatbot
+```
+
+## Usage
+
+```python
+import gradio as gr
+from gradio_awsbr_mmchatbot import MultiModalChatbot
+from gradio.data_classes import FileData
+from bedrock_utils import MultimodalInputHandler
+
+
+# A function to call the multi-modal input for Anthropic Claude v3 sonnet using Bedrock boto3
+async def get_response(text, file):
+ # If there is a file uploaded, then we will send it to Anthropic Claude v3 sonnet.
+ # If there is no file uploaded, then we will send the text to Anthropic Claude v3 sonnet.
+ try:
+ userMsg = {
+ "text": text,
+ "files": [{"file": FileData(path=file)}]
+ }
+ except:
+ userMsg = {
+ "text": text,
+ "files": []
+ }
+ # Define a variable to store the response from the Anthropic Claude v3 sonnet
+ llmResponse = ""
+ handler = MultimodalInputHandler(text, file)
+ # Loop through the response from Anthropic Claude v3 sonnet, and append it to our llmResponse variable.
+ async for x in handler.handleInput():
+ llmResponse += x
+ yield [[userMsg, {"text": llmResponse, "files": []}]]
+ # Yield the response from Anthropic Claude v3 sonnet. This is unecessary as we can just yield the llmResponse variable in an iterative fashion as above.
+ # But just in case.... let's yield the entire response object as well and overwrite the messages in the Chatbot.
+ response = {
+ "text": llmResponse,
+ "files": []
+ }
+ yield [[userMsg, response]]
+
+# Defining Gradio Interface using Blocks Structure
+with gr.Blocks() as demo:
+ # Give it a Title
+ gr.Markdown("## Gradio - MultiModal Chatbot")
+ # Define the Chat Tab
+ with gr.Tab(label="Chat"):
+ with gr.Row():
+ with gr.Column(scale=3):
+ # Set a variable equal to our MultiModalChatBot class
+ chatBot = MultiModalChatbot(height=700, render_markdown=True, bubble_full_width=True)
+ with gr.Row():
+ with gr.Column(scale=3):
+ # Set a variable equal to our user message
+ msg = gr.Textbox(placeholder='What is the meaning of life?', show_label=False)
+ with gr.Column(scale=1):
+ # Set a variable equal to our file upload
+ fileInput = gr.File(label="Upload Files")
+ with gr.Column(scale=1):
+ # Define our submit button and invoke our 'get_response' function when it's clicked.
+ gr.Button('Submit', variant='primary').click(get_response, inputs=[msg,fileInput], outputs=chatBot)
+ # Same function as above, but with the 'enter' key being pressed inside the gr.Textbox() component instead of the 'submit' button.
+ msg.submit(get_response, inputs=[msg, fileInput], outputs=chatBot)
+
+
+if __name__ == '__main__':
+ demo.queue().launch()
+```
+
+## `MultiModalChatbot`
+
+### Initialization
+
+
+
+
+name
+type
+default
+description
+
+
+
+
+value
+
+
+```python
+list[
+ list[
+ str
+ | tuple[str]
+ | tuple[str | pathlib.Path, str]
+ | None
+ ]
+ ]
+ | Callable
+ | None
+```
+
+
+None
+Default value to show in chatbot. If callable, the function will be called whenever the app loads to set the initial value of the component.
+
+
+
+label
+
+
+```python
+str | None
+```
+
+
+None
+The label for this component. Appears above the component and is also used as the header if there are a table of examples for this component. If None and used in a `gr.Interface`, the label will be the name of the parameter this component is assigned to.
+
+
+
+every
+
+
+```python
+float | None
+```
+
+
+None
+If `value` is a callable, run the function 'every' number of seconds while the client connection is open. Has no effect otherwise. The event can be accessed (e.g. to cancel it) via this component's .load_event attribute.
+
+
+
+show_label
+
+
+```python
+bool | None
+```
+
+
+None
+if True, will display label.
+
+
+
+container
+
+
+```python
+bool
+```
+
+
+True
+If True, will place the component in a container - providing some extra padding around the border.
+
+
+
+scale
+
+
+```python
+int | None
+```
+
+
+None
+relative size compared to adjacent Components. For example if Components A and B are in a Row, and A has scale=2, and B has scale=1, A will be twice as wide as B. Should be an integer. scale applies in Rows, and to top-level Components in Blocks where fill_height=True.
+
+
+
+min_width
+
+
+```python
+int
+```
+
+
+160
+minimum pixel width, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in this Component being narrower than min_width, the min_width parameter will be respected first.
+
+
+
+visible
+
+
+```python
+bool
+```
+
+
+True
+If False, component will be hidden.
+
+
+
+elem_id
+
+
+```python
+str | None
+```
+
+
+None
+An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
+
+
+
+elem_classes
+
+
+```python
+list[str] | str | None
+```
+
+
+None
+An optional list of strings that are assigned as the classes of this component in the HTML DOM. Can be used for targeting CSS styles.
+
+
+
+render
+
+
+```python
+bool
+```
+
+
+True
+If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.
+
+
+
+height
+
+
+```python
+int | str | None
+```
+
+
+None
+The height of the component, specified in pixels if a number is passed, or in CSS units if a string is passed.
+
+
+
+latex_delimiters
+
+
+```python
+list[dict[str, str | bool]] | None
+```
+
+
+None
+A list of dicts of the form {"left": open delimiter (str), "right": close delimiter (str), "display": whether to display in newline (bool)} that will be used to render LaTeX expressions. If not provided, `latex_delimiters` is set to `[{ "left": "$$", "right": "$$", "display": True }]`, so only expressions enclosed in $$ delimiters will be rendered as LaTeX, and in a new line. Pass in an empty list to disable LaTeX rendering. For more information, see the [KaTeX documentation](https://katex.org/docs/autorender.html).
+
+
+
+rtl
+
+
+```python
+bool
+```
+
+
+False
+If True, sets the direction of the rendered text to right-to-left. Default is False, which renders text left-to-right.
+
+
+
+show_share_button
+
+
+```python
+bool | None
+```
+
+
+None
+If True, will show a share icon in the corner of the component that allows user to share outputs to Hugging Face Spaces Discussions. If False, icon does not appear. If set to None (default behavior), then the icon appears if this Gradio app is launched on Spaces, but not otherwise.
+
+
+
+show_copy_button
+
+
+```python
+bool
+```
+
+
+False
+If True, will show a copy button for each chatbot message.
+
+
+
+avatar_images
+
+
+```python
+tuple[
+ str | pathlib.Path | None, str | pathlib.Path | None
+ ]
+ | None
+```
+
+
+None
+Tuple of two avatar image paths or URLs for user and bot (in that order). Pass None for either the user or bot image to skip. Must be within the working directory of the Gradio app or an external URL.
+
+
+
+sanitize_html
+
+
+```python
+bool
+```
+
+
+True
+If False, will disable HTML sanitization for chatbot messages. This is not recommended, as it can lead to security vulnerabilities.
+
+
+
+render_markdown
+
+
+```python
+bool
+```
+
+
+True
+If False, will disable Markdown rendering for chatbot messages.
+
+
+
+bubble_full_width
+
+
+```python
+bool
+```
+
+
+True
+If False, the chat bubble will fit to the content of the message. If True (default), the chat bubble will be the full width of the component.
+
+
+
+line_breaks
+
+
+```python
+bool
+```
+
+
+True
+If True (default), will enable Github-flavored Markdown line breaks in chatbot messages. If False, single new lines will be ignored. Only applies if `render_markdown` is True.
+
+
+
+likeable
+
+
+```python
+bool
+```
+
+
+False
+Whether the chat messages display a like or dislike button. Set automatically by the .like method but has to be present in the signature for it to show up in the config.
+
+
+
+layout
+
+
+```python
+"panel" | "bubble" | None
+```
+
+
+None
+If "panel", will display the chatbot in a llm style layout. If "bubble", will display the chatbot with message bubbles, with the user and bot messages on alterating sides. Will default to "bubble".
+
+
+
+
+### Events
+
+| name | description |
+|:-----|:------------|
+| `change` | Triggered when the value of the MultiModalChatbot changes either because of user input (e.g. a user types in a textbox) OR because of a function update (e.g. an image receives a value from the output of an event trigger). See `.input()` for a listener that is only triggered by user input. |
+| `select` | Event listener for when the user selects or deselects the MultiModalChatbot. Uses event data gradio.SelectData to carry `value` referring to the label of the MultiModalChatbot, and `selected` to refer to state of the MultiModalChatbot. See EventData documentation on how to use this event data |
+| `like` | This listener is triggered when the user likes/dislikes from within the MultiModalChatbot. This event has EventData of type gradio.LikeData that carries information, accessible through LikeData.index and LikeData.value. See EventData documentation on how to use this event data. |
+
+
+
+### User function
+
+The impact on the users predict function varies depending on whether the component is used as an input or output for an event (or both).
+
+- When used as an Input, the component only impacts the input signature of the user function.
+- When used as an output, the component only impacts the return signature of the user function.
+
+The code snippet below is accurate in cases where the component is used as both an input and an output.
+
+- **As output:** Is passed, the preprocessed input data sent to the user's function in the backend.
+- **As input:** Should return, expects a `list[list[str | None | tuple]]`, i.e. a list of lists. The inner list should have 2 elements: the user message and the response message. The individual messages can be (1) strings in valid Markdown, (2) tuples if sending files: (a filepath or URL to a file, [optional string alt text]) -- if the file is image/video/audio, it is displayed in the MultiModalChatbot, or (3) None, in which case the message is not displayed.
+
+ ```python
+ def predict(
+ value: list[MultimodalMessage] | None
+ ) -> list[
+ list[str | tuple[str] | tuple[str, str] | None]
+ | tuple
+ ]
+ | None:
+ return value
+ ```
+
+
+## `MultimodalMessage`
+```python
+class MultimodalMessage(GradioModel):
+ text: Optional[str] = None
+ files: Optional[List[FileMessage]] = None
+```
+
+## `FileMessage`
+```python
+class FileMessage(GradioModel):
+ file: FileData
+ alt_text: Optional[str] = None
+```
diff --git a/src/backend/gradio_awsbr_mmchatbot/__init__.py b/src/backend/gradio_awsbr_mmchatbot/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..2cd1826bbc35d066cb6de25686035fa3d58b895c
--- /dev/null
+++ b/src/backend/gradio_awsbr_mmchatbot/__init__.py
@@ -0,0 +1,4 @@
+
+from .multimodalchatbot import MultiModalChatbot
+
+__all__ = ['MultiModalChatbot']
diff --git a/src/backend/gradio_awsbr_mmchatbot/multimodalchatbot.py b/src/backend/gradio_awsbr_mmchatbot/multimodalchatbot.py
new file mode 100644
index 0000000000000000000000000000000000000000..da8bc84db6c6b5d82f9827df35e8bfc4ba448cfd
--- /dev/null
+++ b/src/backend/gradio_awsbr_mmchatbot/multimodalchatbot.py
@@ -0,0 +1,206 @@
+"""gr.Chatbot() component."""
+
+from __future__ import annotations
+
+import inspect
+from pathlib import Path
+from typing import Any, Callable, List, Literal, Optional, Tuple, Union
+
+from gradio_client import utils as client_utils
+from gradio_client.documentation import document
+
+from gradio import utils
+from gradio.components.base import Component
+from gradio.data_classes import FileData, GradioModel, GradioRootModel
+from gradio.events import Events
+
+
+class FileMessage(GradioModel):
+ file: FileData
+ alt_text: Optional[str] = None
+
+class MultimodalMessage(GradioModel):
+ text: Optional[str] = None
+ files: Optional[List[FileMessage]] = None
+
+class ChatbotData(GradioRootModel):
+ root: List[Tuple[Optional[MultimodalMessage], Optional[MultimodalMessage]]]
+
+
+class MultiModalChatbot(Component):
+ """
+ Creates a chatbot that displays user-submitted messages and responses. Supports a subset of Markdown including bold, italics, code, tables.
+ Also supports audio/video/image files, which are displayed in the MultiModalChatbot, and other kinds of files which are displayed as links. This
+ component is usually used as an output component.
+
+ Demos: chatbot_simple, chatbot_multimodal
+ Guides: creating-a-chatbot
+ """
+
+ EVENTS = [Events.change, Events.select, Events.like]
+ data_model = ChatbotData
+
+ def __init__(
+ self,
+ value: list[list[str | tuple[str] | tuple[str | Path, str] | None]]
+ | Callable
+ | None = None,
+ *,
+ label: str | None = None,
+ every: float | None = None,
+ show_label: bool | None = None,
+ container: bool = True,
+ scale: int | None = None,
+ min_width: int = 160,
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ render: bool = True,
+ height: int | str | None = None,
+ latex_delimiters: list[dict[str, str | bool]] | None = None,
+ rtl: bool = False,
+ show_share_button: bool | None = None,
+ show_copy_button: bool = False,
+ avatar_images: tuple[str | Path | None, str | Path | None] | None = None,
+ sanitize_html: bool = True,
+ render_markdown: bool = True,
+ bubble_full_width: bool = True,
+ line_breaks: bool = True,
+ likeable: bool = False,
+ layout: Literal["panel", "bubble"] | None = None,
+ ):
+ """
+ Parameters:
+ value: Default value to show in chatbot. If callable, the function will be called whenever the app loads to set the initial value of the component.
+ label: The label for this component. Appears above the component and is also used as the header if there are a table of examples for this component. If None and used in a `gr.Interface`, the label will be the name of the parameter this component is assigned to.
+ every: If `value` is a callable, run the function 'every' number of seconds while the client connection is open. Has no effect otherwise. The event can be accessed (e.g. to cancel it) via this component's .load_event attribute.
+ show_label: if True, will display label.
+ container: If True, will place the component in a container - providing some extra padding around the border.
+ scale: relative size compared to adjacent Components. For example if Components A and B are in a Row, and A has scale=2, and B has scale=1, A will be twice as wide as B. Should be an integer. scale applies in Rows, and to top-level Components in Blocks where fill_height=True.
+ min_width: minimum pixel width, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in this Component being narrower than min_width, the min_width parameter will be respected first.
+ visible: If False, component will be hidden.
+ elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
+ elem_classes: An optional list of strings that are assigned as the classes of this component in the HTML DOM. Can be used for targeting CSS styles.
+ render: If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.
+ height: The height of the component, specified in pixels if a number is passed, or in CSS units if a string is passed.
+ latex_delimiters: A list of dicts of the form {"left": open delimiter (str), "right": close delimiter (str), "display": whether to display in newline (bool)} that will be used to render LaTeX expressions. If not provided, `latex_delimiters` is set to `[{ "left": "$$", "right": "$$", "display": True }]`, so only expressions enclosed in $$ delimiters will be rendered as LaTeX, and in a new line. Pass in an empty list to disable LaTeX rendering. For more information, see the [KaTeX documentation](https://katex.org/docs/autorender.html).
+ rtl: If True, sets the direction of the rendered text to right-to-left. Default is False, which renders text left-to-right.
+ show_share_button: If True, will show a share icon in the corner of the component that allows user to share outputs to Hugging Face Spaces Discussions. If False, icon does not appear. If set to None (default behavior), then the icon appears if this Gradio app is launched on Spaces, but not otherwise.
+ show_copy_button: If True, will show a copy button for each chatbot message.
+ avatar_images: Tuple of two avatar image paths or URLs for user and bot (in that order). Pass None for either the user or bot image to skip. Must be within the working directory of the Gradio app or an external URL.
+ sanitize_html: If False, will disable HTML sanitization for chatbot messages. This is not recommended, as it can lead to security vulnerabilities.
+ render_markdown: If False, will disable Markdown rendering for chatbot messages.
+ bubble_full_width: If False, the chat bubble will fit to the content of the message. If True (default), the chat bubble will be the full width of the component.
+ line_breaks: If True (default), will enable Github-flavored Markdown line breaks in chatbot messages. If False, single new lines will be ignored. Only applies if `render_markdown` is True.
+ likeable: Whether the chat messages display a like or dislike button. Set automatically by the .like method but has to be present in the signature for it to show up in the config.
+ layout: If "panel", will display the chatbot in a llm style layout. If "bubble", will display the chatbot with message bubbles, with the user and bot messages on alterating sides. Will default to "bubble".
+ """
+ self.likeable = likeable
+ self.height = height
+ self.rtl = rtl
+ if latex_delimiters is None:
+ latex_delimiters = [{"left": "$$", "right": "$$", "display": True}]
+ self.latex_delimiters = latex_delimiters
+ self.show_share_button = (
+ (utils.get_space() is not None)
+ if show_share_button is None
+ else show_share_button
+ )
+ self.render_markdown = render_markdown
+ self.show_copy_button = show_copy_button
+ self.sanitize_html = sanitize_html
+ self.bubble_full_width = bubble_full_width
+ self.line_breaks = line_breaks
+ self.layout = layout
+ super().__init__(
+ label=label,
+ every=every,
+ show_label=show_label,
+ container=container,
+ scale=scale,
+ min_width=min_width,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ value=value,
+ )
+ self.avatar_images: list[dict | None] = [None, None]
+ if avatar_images is None:
+ pass
+ else:
+ self.avatar_images = [
+ self.serve_static_file(avatar_images[0]),
+ self.serve_static_file(avatar_images[1]),
+ ]
+
+ def _preprocess_chat_messages(
+ self, chat_message: str | FileMessage | None
+ ) -> str | tuple[str | None] | tuple[str | None, str] | None:
+ if chat_message is None:
+ return None
+ elif isinstance(chat_message, FileMessage):
+ if chat_message.alt_text is not None:
+ return (chat_message.file.path, chat_message.alt_text)
+ else:
+ return (chat_message.file.path,)
+ elif isinstance(chat_message, str):
+ return chat_message
+ else:
+ raise ValueError(f"Invalid message for MultiModalChatbot component: {chat_message}")
+
+ def preprocess(
+ self,
+ payload: ChatbotData | None,
+ ) -> List[MultimodalMessage] | None:
+ if payload is None:
+ return payload
+ return payload.root
+
+ def _postprocess_chat_messages(
+ self, chat_message: MultimodalMessage | dict | None
+ ) -> MultimodalMessage | None:
+ if chat_message is None:
+ return None
+ if isinstance(chat_message, dict):
+ chat_message = MultimodalMessage(**chat_message)
+ chat_message.text = inspect.cleandoc(chat_message.text or "")
+ for file_ in chat_message.files:
+ file_.file.mime_type = client_utils.get_mimetype(file_.file.path)
+ return chat_message
+
+ def postprocess(
+ self,
+ value: list[list[str | tuple[str] | tuple[str, str] | None] | tuple] | None,
+ ) -> ChatbotData:
+ """
+ Parameters:
+ value: expects a `list[list[str | None | tuple]]`, i.e. a list of lists. The inner list should have 2 elements: the user message and the response message. The individual messages can be (1) strings in valid Markdown, (2) tuples if sending files: (a filepath or URL to a file, [optional string alt text]) -- if the file is image/video/audio, it is displayed in the MultiModalChatbot, or (3) None, in which case the message is not displayed.
+ Returns:
+ an object of type ChatbotData
+ """
+ if value is None:
+ return ChatbotData(root=[])
+ processed_messages = []
+ for message_pair in value:
+ if not isinstance(message_pair, (tuple, list)):
+ raise TypeError(
+ f"Expected a list of lists or list of tuples. Received: {message_pair}"
+ )
+ if len(message_pair) != 2:
+ raise TypeError(
+ f"Expected a list of lists of length 2 or list of tuples of length 2. Received: {message_pair}"
+ )
+ processed_messages.append(
+ [
+ self._postprocess_chat_messages(message_pair[0]),
+ self._postprocess_chat_messages(message_pair[1]),
+ ]
+ )
+ return ChatbotData(root=processed_messages)
+
+ def example_payload(self) -> Any:
+ return [[{"text": "Hello!", "files": []}, None]]
+
+ def example_value(self) -> Any:
+ return [[{"text": "Hello!", "files": []}, None]]
diff --git a/src/backend/gradio_awsbr_mmchatbot/multimodalchatbot.pyi b/src/backend/gradio_awsbr_mmchatbot/multimodalchatbot.pyi
new file mode 100644
index 0000000000000000000000000000000000000000..91d4cabb666b93b9d67ac7b96120b11e16e6e540
--- /dev/null
+++ b/src/backend/gradio_awsbr_mmchatbot/multimodalchatbot.pyi
@@ -0,0 +1,330 @@
+"""gr.Chatbot() component."""
+
+from __future__ import annotations
+
+import inspect
+from pathlib import Path
+from typing import Any, Callable, List, Literal, Optional, Tuple, Union
+
+from gradio_client import utils as client_utils
+from gradio_client.documentation import document
+
+from gradio import utils
+from gradio.components.base import Component
+from gradio.data_classes import FileData, GradioModel, GradioRootModel
+from gradio.events import Events
+
+
+class FileMessage(GradioModel):
+ file: FileData
+ alt_text: Optional[str] = None
+
+
+class ChatbotData(GradioRootModel):
+ root: List[Tuple[Union[str, FileMessage, None], Union[str, FileMessage, None]]]
+
+
+class MultiModalChatbot(Component):
+ """
+ Creates a chatbot that displays user-submitted messages and responses. Supports a subset of Markdown including bold, italics, code, tables.
+ Also supports audio/video/image files, which are displayed in the MultiModalChatbot, and other kinds of files which are displayed as links. This
+ component is usually used as an output component.
+
+ Demos: chatbot_simple, chatbot_multimodal
+ Guides: creating-a-chatbot
+ """
+
+ EVENTS = [Events.change, Events.select, Events.like]
+ data_model = ChatbotData
+
+ def __init__(
+ self,
+ value: list[list[str | tuple[str] | tuple[str | Path, str] | None]]
+ | Callable
+ | None = None,
+ *,
+ label: str | None = None,
+ every: float | None = None,
+ show_label: bool | None = None,
+ container: bool = True,
+ scale: int | None = None,
+ min_width: int = 160,
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ render: bool = True,
+ height: int | str | None = None,
+ latex_delimiters: list[dict[str, str | bool]] | None = None,
+ rtl: bool = False,
+ show_share_button: bool | None = None,
+ show_copy_button: bool = False,
+ avatar_images: tuple[str | Path | None, str | Path | None] | None = None,
+ sanitize_html: bool = True,
+ render_markdown: bool = True,
+ bubble_full_width: bool = True,
+ line_breaks: bool = True,
+ likeable: bool = False,
+ layout: Literal["panel", "bubble"] | None = None,
+ ):
+ """
+ Parameters:
+ value: Default value to show in chatbot. If callable, the function will be called whenever the app loads to set the initial value of the component.
+ label: The label for this component. Appears above the component and is also used as the header if there are a table of examples for this component. If None and used in a `gr.Interface`, the label will be the name of the parameter this component is assigned to.
+ every: If `value` is a callable, run the function 'every' number of seconds while the client connection is open. Has no effect otherwise. The event can be accessed (e.g. to cancel it) via this component's .load_event attribute.
+ show_label: if True, will display label.
+ container: If True, will place the component in a container - providing some extra padding around the border.
+ scale: relative size compared to adjacent Components. For example if Components A and B are in a Row, and A has scale=2, and B has scale=1, A will be twice as wide as B. Should be an integer. scale applies in Rows, and to top-level Components in Blocks where fill_height=True.
+ min_width: minimum pixel width, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in this Component being narrower than min_width, the min_width parameter will be respected first.
+ visible: If False, component will be hidden.
+ elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
+ elem_classes: An optional list of strings that are assigned as the classes of this component in the HTML DOM. Can be used for targeting CSS styles.
+ render: If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.
+ height: The height of the component, specified in pixels if a number is passed, or in CSS units if a string is passed.
+ latex_delimiters: A list of dicts of the form {"left": open delimiter (str), "right": close delimiter (str), "display": whether to display in newline (bool)} that will be used to render LaTeX expressions. If not provided, `latex_delimiters` is set to `[{ "left": "$$", "right": "$$", "display": True }]`, so only expressions enclosed in $$ delimiters will be rendered as LaTeX, and in a new line. Pass in an empty list to disable LaTeX rendering. For more information, see the [KaTeX documentation](https://katex.org/docs/autorender.html).
+ rtl: If True, sets the direction of the rendered text to right-to-left. Default is False, which renders text left-to-right.
+ show_share_button: If True, will show a share icon in the corner of the component that allows user to share outputs to Hugging Face Spaces Discussions. If False, icon does not appear. If set to None (default behavior), then the icon appears if this Gradio app is launched on Spaces, but not otherwise.
+ show_copy_button: If True, will show a copy button for each chatbot message.
+ avatar_images: Tuple of two avatar image paths or URLs for user and bot (in that order). Pass None for either the user or bot image to skip. Must be within the working directory of the Gradio app or an external URL.
+ sanitize_html: If False, will disable HTML sanitization for chatbot messages. This is not recommended, as it can lead to security vulnerabilities.
+ render_markdown: If False, will disable Markdown rendering for chatbot messages.
+ bubble_full_width: If False, the chat bubble will fit to the content of the message. If True (default), the chat bubble will be the full width of the component.
+ line_breaks: If True (default), will enable Github-flavored Markdown line breaks in chatbot messages. If False, single new lines will be ignored. Only applies if `render_markdown` is True.
+ likeable: Whether the chat messages display a like or dislike button. Set automatically by the .like method but has to be present in the signature for it to show up in the config.
+ layout: If "panel", will display the chatbot in a llm style layout. If "bubble", will display the chatbot with message bubbles, with the user and bot messages on alterating sides. Will default to "bubble".
+ """
+ self.likeable = likeable
+ self.height = height
+ self.rtl = rtl
+ if latex_delimiters is None:
+ latex_delimiters = [{"left": "$$", "right": "$$", "display": True}]
+ self.latex_delimiters = latex_delimiters
+ self.show_share_button = (
+ (utils.get_space() is not None)
+ if show_share_button is None
+ else show_share_button
+ )
+ self.render_markdown = render_markdown
+ self.show_copy_button = show_copy_button
+ self.sanitize_html = sanitize_html
+ self.bubble_full_width = bubble_full_width
+ self.line_breaks = line_breaks
+ self.layout = layout
+ super().__init__(
+ label=label,
+ every=every,
+ show_label=show_label,
+ container=container,
+ scale=scale,
+ min_width=min_width,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ value=value,
+ )
+ self.avatar_images: list[dict | None] = [None, None]
+ if avatar_images is None:
+ pass
+ else:
+ self.avatar_images = [
+ self.serve_static_file(avatar_images[0]),
+ self.serve_static_file(avatar_images[1]),
+ ]
+
+ def _preprocess_chat_messages(
+ self, chat_message: str | FileMessage | None
+ ) -> str | tuple[str | None] | tuple[str | None, str] | None:
+ if chat_message is None:
+ return None
+ elif isinstance(chat_message, FileMessage):
+ if chat_message.alt_text is not None:
+ return (chat_message.file.path, chat_message.alt_text)
+ else:
+ return (chat_message.file.path,)
+ elif isinstance(chat_message, str):
+ return chat_message
+ else:
+ raise ValueError(f"Invalid message for MultiModalChatbot component: {chat_message}")
+
+ def preprocess(
+ self,
+ payload: ChatbotData | None,
+ ) -> List[MultimodalMessage] | None:
+ if payload is None:
+ return payload
+ return payload.root
+
+ def _postprocess_chat_messages(
+ self, chat_message: MultimodalMessage | dict | None
+ ) -> MultimodalMessage | None:
+ if chat_message is None:
+ return None
+ if isinstance(chat_message, dict):
+ chat_message = MultimodalMessage(**chat_message)
+ chat_message.text = inspect.cleandoc(chat_message.text or "")
+ for file_ in chat_message.files:
+ file_.file.mime_type = client_utils.get_mimetype(file_.file.path)
+ return chat_message
+
+ def postprocess(
+ self,
+ value: list[list[str | tuple[str] | tuple[str, str] | None] | tuple] | None,
+ ) -> ChatbotData:
+ """
+ Parameters:
+ value: expects a `list[list[str | None | tuple]]`, i.e. a list of lists. The inner list should have 2 elements: the user message and the response message. The individual messages can be (1) strings in valid Markdown, (2) tuples if sending files: (a filepath or URL to a file, [optional string alt text]) -- if the file is image/video/audio, it is displayed in the MultiModalChatbot, or (3) None, in which case the message is not displayed.
+ Returns:
+ an object of type ChatbotData
+ """
+ if value is None:
+ return ChatbotData(root=[])
+ processed_messages = []
+ for message_pair in value:
+ if not isinstance(message_pair, (tuple, list)):
+ raise TypeError(
+ f"Expected a list of lists or list of tuples. Received: {message_pair}"
+ )
+ if len(message_pair) != 2:
+ raise TypeError(
+ f"Expected a list of lists of length 2 or list of tuples of length 2. Received: {message_pair}"
+ )
+ processed_messages.append(
+ [
+ self._postprocess_chat_messages(message_pair[0]),
+ self._postprocess_chat_messages(message_pair[1]),
+ ]
+ )
+ return ChatbotData(root=processed_messages)
+
+ def example_payload(self) -> Any:
+ return [[{"text": "Hello!", "files": []}, None]]
+
+ def example_value(self) -> Any:
+ return [[{"text": "Hello!", "files": []}, None]]
+
+
+ def change(self,
+ fn: Callable | None,
+ inputs: Component | Sequence[Component] | set[Component] | None = None,
+ outputs: Component | Sequence[Component] | None = None,
+ api_name: str | None | Literal[False] = None,
+ scroll_to_output: bool = False,
+ show_progress: Literal["full", "minimal", "hidden"] = "full",
+ queue: bool | None = None,
+ batch: bool = False,
+ max_batch_size: int = 4,
+ preprocess: bool = True,
+ postprocess: bool = True,
+ cancels: dict[str, Any] | list[dict[str, Any]] | None = None,
+ every: float | None = None,
+ trigger_mode: Literal["once", "multiple", "always_last"] | None = None,
+ js: str | None = None,
+ concurrency_limit: int | None | Literal["default"] = "default",
+ concurrency_id: str | None = None,
+ show_api: bool = True) -> Dependency:
+ """
+ Parameters:
+ fn: the function to call when this event is triggered. Often a machine learning model's prediction function. Each parameter of the function corresponds to one input component, and the function should return a single value or a tuple of values, with each element in the tuple corresponding to one output component.
+ inputs: List of gradio.components to use as inputs. If the function takes no inputs, this should be an empty list.
+ outputs: List of gradio.components to use as outputs. If the function returns no outputs, this should be an empty list.
+ api_name: Defines how the endpoint appears in the API docs. Can be a string, None, or False. If False, the endpoint will not be exposed in the api docs. If set to None, the endpoint will be exposed in the api docs as an unnamed endpoint, although this behavior will be changed in Gradio 4.0. If set to a string, the endpoint will be exposed in the api docs with the given name.
+ scroll_to_output: If True, will scroll to output component on completion
+ show_progress: If True, will show progress animation while pending
+ queue: If True, will place the request on the queue, if the queue has been enabled. If False, will not put this event on the queue, even if the queue has been enabled. If None, will use the queue setting of the gradio app.
+ batch: If True, then the function should process a batch of inputs, meaning that it should accept a list of input values for each parameter. The lists should be of equal length (and be up to length `max_batch_size`). The function is then *required* to return a tuple of lists (even if there is only 1 output component), with each list in the tuple corresponding to one output component.
+ max_batch_size: Maximum number of inputs to batch together if this is called from the queue (only relevant if batch=True)
+ preprocess: If False, will not run preprocessing of component data before running 'fn' (e.g. leaving it as a base64 string if this method is called with the `Image` component).
+ postprocess: If False, will not run postprocessing of component data before returning 'fn' output to the browser.
+ cancels: A list of other events to cancel when this listener is triggered. For example, setting cancels=[click_event] will cancel the click_event, where click_event is the return value of another components .click method. Functions that have not yet run (or generators that are iterating) will be cancelled, but functions that are currently running will be allowed to finish.
+ every: Run this event 'every' number of seconds while the client connection is open. Interpreted in seconds.
+ trigger_mode: If "once" (default for all events except `.change()`) would not allow any submissions while an event is pending. If set to "multiple", unlimited submissions are allowed while pending, and "always_last" (default for `.change()` and `.key_up()` events) would allow a second submission after the pending event is complete.
+ js: Optional frontend js method to run before running 'fn'. Input arguments for js method are values of 'inputs' and 'outputs', return should be a list of values for output components.
+ concurrency_limit: If set, this is the maximum number of this event that can be running simultaneously. Can be set to None to mean no concurrency_limit (any number of this event can be running simultaneously). Set to "default" to use the default concurrency limit (defined by the `default_concurrency_limit` parameter in `Blocks.queue()`, which itself is 1 by default).
+ concurrency_id: If set, this is the id of the concurrency group. Events with the same concurrency_id will be limited by the lowest set concurrency_limit.
+ show_api: whether to show this event in the "view API" page of the Gradio app, or in the ".view_api()" method of the Gradio clients. Unlike setting api_name to False, setting show_api to False will still allow downstream apps to use this event. If fn is None, show_api will automatically be set to False.
+ """
+ ...
+
+ def select(self,
+ fn: Callable | None,
+ inputs: Component | Sequence[Component] | set[Component] | None = None,
+ outputs: Component | Sequence[Component] | None = None,
+ api_name: str | None | Literal[False] = None,
+ scroll_to_output: bool = False,
+ show_progress: Literal["full", "minimal", "hidden"] = "full",
+ queue: bool | None = None,
+ batch: bool = False,
+ max_batch_size: int = 4,
+ preprocess: bool = True,
+ postprocess: bool = True,
+ cancels: dict[str, Any] | list[dict[str, Any]] | None = None,
+ every: float | None = None,
+ trigger_mode: Literal["once", "multiple", "always_last"] | None = None,
+ js: str | None = None,
+ concurrency_limit: int | None | Literal["default"] = "default",
+ concurrency_id: str | None = None,
+ show_api: bool = True) -> Dependency:
+ """
+ Parameters:
+ fn: the function to call when this event is triggered. Often a machine learning model's prediction function. Each parameter of the function corresponds to one input component, and the function should return a single value or a tuple of values, with each element in the tuple corresponding to one output component.
+ inputs: List of gradio.components to use as inputs. If the function takes no inputs, this should be an empty list.
+ outputs: List of gradio.components to use as outputs. If the function returns no outputs, this should be an empty list.
+ api_name: Defines how the endpoint appears in the API docs. Can be a string, None, or False. If False, the endpoint will not be exposed in the api docs. If set to None, the endpoint will be exposed in the api docs as an unnamed endpoint, although this behavior will be changed in Gradio 4.0. If set to a string, the endpoint will be exposed in the api docs with the given name.
+ scroll_to_output: If True, will scroll to output component on completion
+ show_progress: If True, will show progress animation while pending
+ queue: If True, will place the request on the queue, if the queue has been enabled. If False, will not put this event on the queue, even if the queue has been enabled. If None, will use the queue setting of the gradio app.
+ batch: If True, then the function should process a batch of inputs, meaning that it should accept a list of input values for each parameter. The lists should be of equal length (and be up to length `max_batch_size`). The function is then *required* to return a tuple of lists (even if there is only 1 output component), with each list in the tuple corresponding to one output component.
+ max_batch_size: Maximum number of inputs to batch together if this is called from the queue (only relevant if batch=True)
+ preprocess: If False, will not run preprocessing of component data before running 'fn' (e.g. leaving it as a base64 string if this method is called with the `Image` component).
+ postprocess: If False, will not run postprocessing of component data before returning 'fn' output to the browser.
+ cancels: A list of other events to cancel when this listener is triggered. For example, setting cancels=[click_event] will cancel the click_event, where click_event is the return value of another components .click method. Functions that have not yet run (or generators that are iterating) will be cancelled, but functions that are currently running will be allowed to finish.
+ every: Run this event 'every' number of seconds while the client connection is open. Interpreted in seconds.
+ trigger_mode: If "once" (default for all events except `.change()`) would not allow any submissions while an event is pending. If set to "multiple", unlimited submissions are allowed while pending, and "always_last" (default for `.change()` and `.key_up()` events) would allow a second submission after the pending event is complete.
+ js: Optional frontend js method to run before running 'fn'. Input arguments for js method are values of 'inputs' and 'outputs', return should be a list of values for output components.
+ concurrency_limit: If set, this is the maximum number of this event that can be running simultaneously. Can be set to None to mean no concurrency_limit (any number of this event can be running simultaneously). Set to "default" to use the default concurrency limit (defined by the `default_concurrency_limit` parameter in `Blocks.queue()`, which itself is 1 by default).
+ concurrency_id: If set, this is the id of the concurrency group. Events with the same concurrency_id will be limited by the lowest set concurrency_limit.
+ show_api: whether to show this event in the "view API" page of the Gradio app, or in the ".view_api()" method of the Gradio clients. Unlike setting api_name to False, setting show_api to False will still allow downstream apps to use this event. If fn is None, show_api will automatically be set to False.
+ """
+ ...
+
+ def like(self,
+ fn: Callable | None,
+ inputs: Component | Sequence[Component] | set[Component] | None = None,
+ outputs: Component | Sequence[Component] | None = None,
+ api_name: str | None | Literal[False] = None,
+ scroll_to_output: bool = False,
+ show_progress: Literal["full", "minimal", "hidden"] = "full",
+ queue: bool | None = None,
+ batch: bool = False,
+ max_batch_size: int = 4,
+ preprocess: bool = True,
+ postprocess: bool = True,
+ cancels: dict[str, Any] | list[dict[str, Any]] | None = None,
+ every: float | None = None,
+ trigger_mode: Literal["once", "multiple", "always_last"] | None = None,
+ js: str | None = None,
+ concurrency_limit: int | None | Literal["default"] = "default",
+ concurrency_id: str | None = None,
+ show_api: bool = True) -> Dependency:
+ """
+ Parameters:
+ fn: the function to call when this event is triggered. Often a machine learning model's prediction function. Each parameter of the function corresponds to one input component, and the function should return a single value or a tuple of values, with each element in the tuple corresponding to one output component.
+ inputs: List of gradio.components to use as inputs. If the function takes no inputs, this should be an empty list.
+ outputs: List of gradio.components to use as outputs. If the function returns no outputs, this should be an empty list.
+ api_name: Defines how the endpoint appears in the API docs. Can be a string, None, or False. If False, the endpoint will not be exposed in the api docs. If set to None, the endpoint will be exposed in the api docs as an unnamed endpoint, although this behavior will be changed in Gradio 4.0. If set to a string, the endpoint will be exposed in the api docs with the given name.
+ scroll_to_output: If True, will scroll to output component on completion
+ show_progress: If True, will show progress animation while pending
+ queue: If True, will place the request on the queue, if the queue has been enabled. If False, will not put this event on the queue, even if the queue has been enabled. If None, will use the queue setting of the gradio app.
+ batch: If True, then the function should process a batch of inputs, meaning that it should accept a list of input values for each parameter. The lists should be of equal length (and be up to length `max_batch_size`). The function is then *required* to return a tuple of lists (even if there is only 1 output component), with each list in the tuple corresponding to one output component.
+ max_batch_size: Maximum number of inputs to batch together if this is called from the queue (only relevant if batch=True)
+ preprocess: If False, will not run preprocessing of component data before running 'fn' (e.g. leaving it as a base64 string if this method is called with the `Image` component).
+ postprocess: If False, will not run postprocessing of component data before returning 'fn' output to the browser.
+ cancels: A list of other events to cancel when this listener is triggered. For example, setting cancels=[click_event] will cancel the click_event, where click_event is the return value of another components .click method. Functions that have not yet run (or generators that are iterating) will be cancelled, but functions that are currently running will be allowed to finish.
+ every: Run this event 'every' number of seconds while the client connection is open. Interpreted in seconds.
+ trigger_mode: If "once" (default for all events except `.change()`) would not allow any submissions while an event is pending. If set to "multiple", unlimited submissions are allowed while pending, and "always_last" (default for `.change()` and `.key_up()` events) would allow a second submission after the pending event is complete.
+ js: Optional frontend js method to run before running 'fn'. Input arguments for js method are values of 'inputs' and 'outputs', return should be a list of values for output components.
+ concurrency_limit: If set, this is the maximum number of this event that can be running simultaneously. Can be set to None to mean no concurrency_limit (any number of this event can be running simultaneously). Set to "default" to use the default concurrency limit (defined by the `default_concurrency_limit` parameter in `Blocks.queue()`, which itself is 1 by default).
+ concurrency_id: If set, this is the id of the concurrency group. Events with the same concurrency_id will be limited by the lowest set concurrency_limit.
+ show_api: whether to show this event in the "view API" page of the Gradio app, or in the ".view_api()" method of the Gradio clients. Unlike setting api_name to False, setting show_api to False will still allow downstream apps to use this event. If fn is None, show_api will automatically be set to False.
+ """
+ ...
diff --git a/src/backend/gradio_awsbr_mmchatbot/templates/component/assets/worker-43d19264.js b/src/backend/gradio_awsbr_mmchatbot/templates/component/assets/worker-43d19264.js
new file mode 100644
index 0000000000000000000000000000000000000000..074e970cb2c259e402298bda36d09c6a0916f229
--- /dev/null
+++ b/src/backend/gradio_awsbr_mmchatbot/templates/component/assets/worker-43d19264.js
@@ -0,0 +1 @@
+(function(){"use strict";const R="https://unpkg.com/@ffmpeg/core@0.12.6/dist/umd/ffmpeg-core.js";var E;(function(t){t.LOAD="LOAD",t.EXEC="EXEC",t.WRITE_FILE="WRITE_FILE",t.READ_FILE="READ_FILE",t.DELETE_FILE="DELETE_FILE",t.RENAME="RENAME",t.CREATE_DIR="CREATE_DIR",t.LIST_DIR="LIST_DIR",t.DELETE_DIR="DELETE_DIR",t.ERROR="ERROR",t.DOWNLOAD="DOWNLOAD",t.PROGRESS="PROGRESS",t.LOG="LOG",t.MOUNT="MOUNT",t.UNMOUNT="UNMOUNT"})(E||(E={}));const a=new Error("unknown message type"),f=new Error("ffmpeg is not loaded, call `await ffmpeg.load()` first"),u=new Error("failed to import ffmpeg-core.js");let r;const O=async({coreURL:t,wasmURL:n,workerURL:e})=>{const o=!r;try{t||(t=R),importScripts(t)}catch{if(t||(t=R.replace("/umd/","/esm/")),self.createFFmpegCore=(await import(t)).default,!self.createFFmpegCore)throw u}const s=t,c=n||t.replace(/.js$/g,".wasm"),b=e||t.replace(/.js$/g,".worker.js");return r=await self.createFFmpegCore({mainScriptUrlOrBlob:`${s}#${btoa(JSON.stringify({wasmURL:c,workerURL:b}))}`}),r.setLogger(i=>self.postMessage({type:E.LOG,data:i})),r.setProgress(i=>self.postMessage({type:E.PROGRESS,data:i})),o},l=({args:t,timeout:n=-1})=>{r.setTimeout(n),r.exec(...t);const e=r.ret;return r.reset(),e},m=({path:t,data:n})=>(r.FS.writeFile(t,n),!0),D=({path:t,encoding:n})=>r.FS.readFile(t,{encoding:n}),S=({path:t})=>(r.FS.unlink(t),!0),I=({oldPath:t,newPath:n})=>(r.FS.rename(t,n),!0),L=({path:t})=>(r.FS.mkdir(t),!0),N=({path:t})=>{const n=r.FS.readdir(t),e=[];for(const o of n){const s=r.FS.stat(`${t}/${o}`),c=r.FS.isDir(s.mode);e.push({name:o,isDir:c})}return e},A=({path:t})=>(r.FS.rmdir(t),!0),w=({fsType:t,options:n,mountPoint:e})=>{const o=t,s=r.FS.filesystems[o];return s?(r.FS.mount(s,n,e),!0):!1},k=({mountPoint:t})=>(r.FS.unmount(t),!0);self.onmessage=async({data:{id:t,type:n,data:e}})=>{const o=[];let s;try{if(n!==E.LOAD&&!r)throw f;switch(n){case E.LOAD:s=await O(e);break;case E.EXEC:s=l(e);break;case E.WRITE_FILE:s=m(e);break;case E.READ_FILE:s=D(e);break;case E.DELETE_FILE:s=S(e);break;case E.RENAME:s=I(e);break;case E.CREATE_DIR:s=L(e);break;case E.LIST_DIR:s=N(e);break;case E.DELETE_DIR:s=A(e);break;case E.MOUNT:s=w(e);break;case E.UNMOUNT:s=k(e);break;default:throw a}}catch(c){self.postMessage({id:t,type:E.ERROR,data:c.toString()});return}s instanceof Uint8Array&&o.push(s.buffer),self.postMessage({id:t,type:n,data:s},o)}})();
diff --git a/src/backend/gradio_awsbr_mmchatbot/templates/component/index.js b/src/backend/gradio_awsbr_mmchatbot/templates/component/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..678da87605ab00e049c7f9e14ce5c0ad88a0e279
--- /dev/null
+++ b/src/backend/gradio_awsbr_mmchatbot/templates/component/index.js
@@ -0,0 +1,19464 @@
+var n1 = Object.defineProperty;
+var r1 = (a, r, s) => r in a ? n1(a, r, { enumerable: !0, configurable: !0, writable: !0, value: s }) : a[r] = s;
+var Ue = (a, r, s) => (r1(a, typeof r != "symbol" ? r + "" : r, s), s), s1 = (a, r, s) => {
+ if (!r.has(a))
+ throw TypeError("Cannot " + s);
+};
+var cs = (a, r, s) => {
+ if (r.has(a))
+ throw TypeError("Cannot add the same private member more than once");
+ r instanceof WeakSet ? r.add(a) : r.set(a, s);
+};
+var rr = (a, r, s) => (s1(a, r, "access private method"), s);
+const i1 = [
+ { color: "red", primary: 600, secondary: 100 },
+ { color: "green", primary: 600, secondary: 100 },
+ { color: "blue", primary: 600, secondary: 100 },
+ { color: "yellow", primary: 500, secondary: 100 },
+ { color: "purple", primary: 600, secondary: 100 },
+ { color: "teal", primary: 600, secondary: 100 },
+ { color: "orange", primary: 600, secondary: 100 },
+ { color: "cyan", primary: 600, secondary: 100 },
+ { color: "lime", primary: 500, secondary: 100 },
+ { color: "pink", primary: 600, secondary: 100 }
+], fl = {
+ inherit: "inherit",
+ current: "currentColor",
+ transparent: "transparent",
+ black: "#000",
+ white: "#fff",
+ slate: {
+ 50: "#f8fafc",
+ 100: "#f1f5f9",
+ 200: "#e2e8f0",
+ 300: "#cbd5e1",
+ 400: "#94a3b8",
+ 500: "#64748b",
+ 600: "#475569",
+ 700: "#334155",
+ 800: "#1e293b",
+ 900: "#0f172a",
+ 950: "#020617"
+ },
+ gray: {
+ 50: "#f9fafb",
+ 100: "#f3f4f6",
+ 200: "#e5e7eb",
+ 300: "#d1d5db",
+ 400: "#9ca3af",
+ 500: "#6b7280",
+ 600: "#4b5563",
+ 700: "#374151",
+ 800: "#1f2937",
+ 900: "#111827",
+ 950: "#030712"
+ },
+ zinc: {
+ 50: "#fafafa",
+ 100: "#f4f4f5",
+ 200: "#e4e4e7",
+ 300: "#d4d4d8",
+ 400: "#a1a1aa",
+ 500: "#71717a",
+ 600: "#52525b",
+ 700: "#3f3f46",
+ 800: "#27272a",
+ 900: "#18181b",
+ 950: "#09090b"
+ },
+ neutral: {
+ 50: "#fafafa",
+ 100: "#f5f5f5",
+ 200: "#e5e5e5",
+ 300: "#d4d4d4",
+ 400: "#a3a3a3",
+ 500: "#737373",
+ 600: "#525252",
+ 700: "#404040",
+ 800: "#262626",
+ 900: "#171717",
+ 950: "#0a0a0a"
+ },
+ stone: {
+ 50: "#fafaf9",
+ 100: "#f5f5f4",
+ 200: "#e7e5e4",
+ 300: "#d6d3d1",
+ 400: "#a8a29e",
+ 500: "#78716c",
+ 600: "#57534e",
+ 700: "#44403c",
+ 800: "#292524",
+ 900: "#1c1917",
+ 950: "#0c0a09"
+ },
+ red: {
+ 50: "#fef2f2",
+ 100: "#fee2e2",
+ 200: "#fecaca",
+ 300: "#fca5a5",
+ 400: "#f87171",
+ 500: "#ef4444",
+ 600: "#dc2626",
+ 700: "#b91c1c",
+ 800: "#991b1b",
+ 900: "#7f1d1d",
+ 950: "#450a0a"
+ },
+ orange: {
+ 50: "#fff7ed",
+ 100: "#ffedd5",
+ 200: "#fed7aa",
+ 300: "#fdba74",
+ 400: "#fb923c",
+ 500: "#f97316",
+ 600: "#ea580c",
+ 700: "#c2410c",
+ 800: "#9a3412",
+ 900: "#7c2d12",
+ 950: "#431407"
+ },
+ amber: {
+ 50: "#fffbeb",
+ 100: "#fef3c7",
+ 200: "#fde68a",
+ 300: "#fcd34d",
+ 400: "#fbbf24",
+ 500: "#f59e0b",
+ 600: "#d97706",
+ 700: "#b45309",
+ 800: "#92400e",
+ 900: "#78350f",
+ 950: "#451a03"
+ },
+ yellow: {
+ 50: "#fefce8",
+ 100: "#fef9c3",
+ 200: "#fef08a",
+ 300: "#fde047",
+ 400: "#facc15",
+ 500: "#eab308",
+ 600: "#ca8a04",
+ 700: "#a16207",
+ 800: "#854d0e",
+ 900: "#713f12",
+ 950: "#422006"
+ },
+ lime: {
+ 50: "#f7fee7",
+ 100: "#ecfccb",
+ 200: "#d9f99d",
+ 300: "#bef264",
+ 400: "#a3e635",
+ 500: "#84cc16",
+ 600: "#65a30d",
+ 700: "#4d7c0f",
+ 800: "#3f6212",
+ 900: "#365314",
+ 950: "#1a2e05"
+ },
+ green: {
+ 50: "#f0fdf4",
+ 100: "#dcfce7",
+ 200: "#bbf7d0",
+ 300: "#86efac",
+ 400: "#4ade80",
+ 500: "#22c55e",
+ 600: "#16a34a",
+ 700: "#15803d",
+ 800: "#166534",
+ 900: "#14532d",
+ 950: "#052e16"
+ },
+ emerald: {
+ 50: "#ecfdf5",
+ 100: "#d1fae5",
+ 200: "#a7f3d0",
+ 300: "#6ee7b7",
+ 400: "#34d399",
+ 500: "#10b981",
+ 600: "#059669",
+ 700: "#047857",
+ 800: "#065f46",
+ 900: "#064e3b",
+ 950: "#022c22"
+ },
+ teal: {
+ 50: "#f0fdfa",
+ 100: "#ccfbf1",
+ 200: "#99f6e4",
+ 300: "#5eead4",
+ 400: "#2dd4bf",
+ 500: "#14b8a6",
+ 600: "#0d9488",
+ 700: "#0f766e",
+ 800: "#115e59",
+ 900: "#134e4a",
+ 950: "#042f2e"
+ },
+ cyan: {
+ 50: "#ecfeff",
+ 100: "#cffafe",
+ 200: "#a5f3fc",
+ 300: "#67e8f9",
+ 400: "#22d3ee",
+ 500: "#06b6d4",
+ 600: "#0891b2",
+ 700: "#0e7490",
+ 800: "#155e75",
+ 900: "#164e63",
+ 950: "#083344"
+ },
+ sky: {
+ 50: "#f0f9ff",
+ 100: "#e0f2fe",
+ 200: "#bae6fd",
+ 300: "#7dd3fc",
+ 400: "#38bdf8",
+ 500: "#0ea5e9",
+ 600: "#0284c7",
+ 700: "#0369a1",
+ 800: "#075985",
+ 900: "#0c4a6e",
+ 950: "#082f49"
+ },
+ blue: {
+ 50: "#eff6ff",
+ 100: "#dbeafe",
+ 200: "#bfdbfe",
+ 300: "#93c5fd",
+ 400: "#60a5fa",
+ 500: "#3b82f6",
+ 600: "#2563eb",
+ 700: "#1d4ed8",
+ 800: "#1e40af",
+ 900: "#1e3a8a",
+ 950: "#172554"
+ },
+ indigo: {
+ 50: "#eef2ff",
+ 100: "#e0e7ff",
+ 200: "#c7d2fe",
+ 300: "#a5b4fc",
+ 400: "#818cf8",
+ 500: "#6366f1",
+ 600: "#4f46e5",
+ 700: "#4338ca",
+ 800: "#3730a3",
+ 900: "#312e81",
+ 950: "#1e1b4b"
+ },
+ violet: {
+ 50: "#f5f3ff",
+ 100: "#ede9fe",
+ 200: "#ddd6fe",
+ 300: "#c4b5fd",
+ 400: "#a78bfa",
+ 500: "#8b5cf6",
+ 600: "#7c3aed",
+ 700: "#6d28d9",
+ 800: "#5b21b6",
+ 900: "#4c1d95",
+ 950: "#2e1065"
+ },
+ purple: {
+ 50: "#faf5ff",
+ 100: "#f3e8ff",
+ 200: "#e9d5ff",
+ 300: "#d8b4fe",
+ 400: "#c084fc",
+ 500: "#a855f7",
+ 600: "#9333ea",
+ 700: "#7e22ce",
+ 800: "#6b21a8",
+ 900: "#581c87",
+ 950: "#3b0764"
+ },
+ fuchsia: {
+ 50: "#fdf4ff",
+ 100: "#fae8ff",
+ 200: "#f5d0fe",
+ 300: "#f0abfc",
+ 400: "#e879f9",
+ 500: "#d946ef",
+ 600: "#c026d3",
+ 700: "#a21caf",
+ 800: "#86198f",
+ 900: "#701a75",
+ 950: "#4a044e"
+ },
+ pink: {
+ 50: "#fdf2f8",
+ 100: "#fce7f3",
+ 200: "#fbcfe8",
+ 300: "#f9a8d4",
+ 400: "#f472b6",
+ 500: "#ec4899",
+ 600: "#db2777",
+ 700: "#be185d",
+ 800: "#9d174d",
+ 900: "#831843",
+ 950: "#500724"
+ },
+ rose: {
+ 50: "#fff1f2",
+ 100: "#ffe4e6",
+ 200: "#fecdd3",
+ 300: "#fda4af",
+ 400: "#fb7185",
+ 500: "#f43f5e",
+ 600: "#e11d48",
+ 700: "#be123c",
+ 800: "#9f1239",
+ 900: "#881337",
+ 950: "#4c0519"
+ }
+};
+i1.reduce(
+ (a, { color: r, primary: s, secondary: i }) => ({
+ ...a,
+ [r]: {
+ primary: fl[r][s],
+ secondary: fl[r][i]
+ }
+ }),
+ {}
+);
+function lo(a) {
+ let r, s = a[0], i = 1;
+ for (; i < a.length; ) {
+ const o = a[i], u = a[i + 1];
+ if (i += 2, (o === "optionalAccess" || o === "optionalCall") && s == null)
+ return;
+ o === "access" || o === "optionalAccess" ? (r = s, s = u(s)) : (o === "call" || o === "optionalCall") && (s = u((...f) => s.call(r, ...f)), r = void 0);
+ }
+ return s;
+}
+class gr extends Error {
+ constructor(r) {
+ super(r), this.name = "ShareError";
+ }
+}
+async function dl(a, r) {
+ if (window.__gradio_space__ == null)
+ throw new gr("Must be on Spaces to share.");
+ let s, i, o;
+ if (r === "url") {
+ const g = await fetch(a);
+ s = await g.blob(), i = g.headers.get("content-type") || "", o = g.headers.get("content-disposition") || "";
+ } else
+ s = l1(a), i = a.split(";")[0].split(":")[1], o = "file" + i.split("/")[1];
+ const u = new File([s], o, { type: i }), f = await fetch("https://huggingface.co/uploads", {
+ method: "POST",
+ body: u,
+ headers: {
+ "Content-Type": u.type,
+ "X-Requested-With": "XMLHttpRequest"
+ }
+ });
+ if (!f.ok) {
+ if (lo([f, "access", (g) => g.headers, "access", (g) => g.get, "call", (g) => g("content-type"), "optionalAccess", (g) => g.includes, "call", (g) => g("application/json")])) {
+ const g = await f.json();
+ throw new gr(`Upload failed: ${g.error}`);
+ }
+ throw new gr("Upload failed.");
+ }
+ return await f.text();
+}
+function l1(a) {
+ for (var r = a.split(","), s = r[0].match(/:(.*?);/)[1], i = atob(r[1]), o = i.length, u = new Uint8Array(o); o--; )
+ u[o] = i.charCodeAt(o);
+ return new Blob([u], { type: s });
+}
+function a1(a) {
+ a.addEventListener("click", r);
+ async function r(s) {
+ const i = s.composedPath(), [o] = i.filter(
+ (u) => lo([u, "optionalAccess", (f) => f.tagName]) === "BUTTON" && u.classList.contains("copy_code_button")
+ );
+ if (o) {
+ let u = function(y) {
+ y.style.opacity = "1", setTimeout(() => {
+ y.style.opacity = "0";
+ }, 2e3);
+ };
+ s.stopImmediatePropagation();
+ const f = o.parentElement.innerText.trim(), p = Array.from(
+ o.children
+ )[1];
+ await o1(f) && u(p);
+ }
+ }
+ return {
+ destroy() {
+ a.removeEventListener("click", r);
+ }
+ };
+}
+async function o1(a) {
+ let r = !1;
+ if ("clipboard" in navigator)
+ await navigator.clipboard.writeText(a), r = !0;
+ else {
+ const s = document.createElement("textarea");
+ s.value = a, s.style.position = "absolute", s.style.left = "-999999px", document.body.prepend(s), s.select();
+ try {
+ document.execCommand("copy"), r = !0;
+ } catch (i) {
+ console.error(i), r = !1;
+ } finally {
+ s.remove();
+ }
+ }
+ return r;
+}
+function sr(a) {
+ let r, s = a[0], i = 1;
+ for (; i < a.length; ) {
+ const o = a[i], u = a[i + 1];
+ if (i += 2, (o === "optionalAccess" || o === "optionalCall") && s == null)
+ return;
+ o === "access" || o === "optionalAccess" ? (r = s, s = u(s)) : (o === "call" || o === "optionalCall") && (s = u((...f) => s.call(r, ...f)), r = void 0);
+ }
+ return s;
+}
+const u1 = async (a) => (await Promise.all(
+ a.map(async (s) => await Promise.all(
+ s.map(async (i, o) => {
+ if (i === null)
+ return "";
+ let u = o === 0 ? "😃" : "🤖", f = "";
+ if (typeof i == "string") {
+ const p = {
+ audio: / |!\[.*?\]\((\/file=.*?)\)/g
+ };
+ f = i;
+ for (let [g, y] of Object.entries(p)) {
+ let D;
+ for (; (D = y.exec(i)) !== null; ) {
+ const T = D[1] || D[2], P = await dl(T, "url");
+ f = f.replace(T, P);
+ }
+ }
+ } else {
+ if (!sr([i, "optionalAccess", (g) => g.url]))
+ return "";
+ const p = await dl(i.url, "url");
+ sr([i, "access", (g) => g.mime_type, "optionalAccess", (g) => g.includes, "call", (g) => g("audio")]) ? f = ` ` : sr([i, "access", (g) => g.mime_type, "optionalAccess", (g) => g.includes, "call", (g) => g("video")]) ? f = p : sr([i, "access", (g) => g.mime_type, "optionalAccess", (g) => g.includes, "call", (g) => g("image")]) && (f = ` `);
+ }
+ return `${u}: ${f}`;
+ })
+ ))
+)).map(
+ (s) => s.join(
+ s[0] !== "" && s[1] !== "" ? `
+` : ""
+ )
+).join(`
+`);
+var ml = Object.prototype.hasOwnProperty;
+function Ms(a, r) {
+ var s, i;
+ if (a === r)
+ return !0;
+ if (a && r && (s = a.constructor) === r.constructor) {
+ if (s === Date)
+ return a.getTime() === r.getTime();
+ if (s === RegExp)
+ return a.toString() === r.toString();
+ if (s === Array) {
+ if ((i = a.length) === r.length)
+ for (; i-- && Ms(a[i], r[i]); )
+ ;
+ return i === -1;
+ }
+ if (!s || typeof a == "object") {
+ i = 0;
+ for (s in a)
+ if (ml.call(a, s) && ++i && !ml.call(r, s) || !(s in r) || !Ms(a[s], r[s]))
+ return !1;
+ return Object.keys(r).length === i;
+ }
+ }
+ return a !== a && r !== r;
+}
+const {
+ SvelteComponent: c1,
+ assign: h1,
+ create_slot: f1,
+ detach: d1,
+ element: m1,
+ get_all_dirty_from_scope: p1,
+ get_slot_changes: g1,
+ get_spread_update: b1,
+ init: w1,
+ insert: y1,
+ safe_not_equal: _1,
+ set_dynamic_element_data: pl,
+ set_style: wt,
+ toggle_class: F0,
+ transition_in: ao,
+ transition_out: oo,
+ update_slot_base: k1
+} = window.__gradio__svelte__internal;
+function x1(a) {
+ let r, s, i;
+ const o = (
+ /*#slots*/
+ a[18].default
+ ), u = f1(
+ o,
+ a,
+ /*$$scope*/
+ a[17],
+ null
+ );
+ let f = [
+ { "data-testid": (
+ /*test_id*/
+ a[7]
+ ) },
+ { id: (
+ /*elem_id*/
+ a[2]
+ ) },
+ {
+ class: s = "block " + /*elem_classes*/
+ a[3].join(" ") + " svelte-1t38q2d"
+ }
+ ], p = {};
+ for (let g = 0; g < f.length; g += 1)
+ p = h1(p, f[g]);
+ return {
+ c() {
+ r = m1(
+ /*tag*/
+ a[14]
+ ), u && u.c(), pl(
+ /*tag*/
+ a[14]
+ )(r, p), F0(
+ r,
+ "hidden",
+ /*visible*/
+ a[10] === !1
+ ), F0(
+ r,
+ "padded",
+ /*padding*/
+ a[6]
+ ), F0(
+ r,
+ "border_focus",
+ /*border_mode*/
+ a[5] === "focus"
+ ), F0(r, "hide-container", !/*explicit_call*/
+ a[8] && !/*container*/
+ a[9]), wt(
+ r,
+ "height",
+ /*get_dimension*/
+ a[15](
+ /*height*/
+ a[0]
+ )
+ ), wt(r, "width", typeof /*width*/
+ a[1] == "number" ? `calc(min(${/*width*/
+ a[1]}px, 100%))` : (
+ /*get_dimension*/
+ a[15](
+ /*width*/
+ a[1]
+ )
+ )), wt(
+ r,
+ "border-style",
+ /*variant*/
+ a[4]
+ ), wt(
+ r,
+ "overflow",
+ /*allow_overflow*/
+ a[11] ? "visible" : "hidden"
+ ), wt(
+ r,
+ "flex-grow",
+ /*scale*/
+ a[12]
+ ), wt(r, "min-width", `calc(min(${/*min_width*/
+ a[13]}px, 100%))`), wt(r, "border-width", "var(--block-border-width)");
+ },
+ m(g, y) {
+ y1(g, r, y), u && u.m(r, null), i = !0;
+ },
+ p(g, y) {
+ u && u.p && (!i || y & /*$$scope*/
+ 131072) && k1(
+ u,
+ o,
+ g,
+ /*$$scope*/
+ g[17],
+ i ? g1(
+ o,
+ /*$$scope*/
+ g[17],
+ y,
+ null
+ ) : p1(
+ /*$$scope*/
+ g[17]
+ ),
+ null
+ ), pl(
+ /*tag*/
+ g[14]
+ )(r, p = b1(f, [
+ (!i || y & /*test_id*/
+ 128) && { "data-testid": (
+ /*test_id*/
+ g[7]
+ ) },
+ (!i || y & /*elem_id*/
+ 4) && { id: (
+ /*elem_id*/
+ g[2]
+ ) },
+ (!i || y & /*elem_classes*/
+ 8 && s !== (s = "block " + /*elem_classes*/
+ g[3].join(" ") + " svelte-1t38q2d")) && { class: s }
+ ])), F0(
+ r,
+ "hidden",
+ /*visible*/
+ g[10] === !1
+ ), F0(
+ r,
+ "padded",
+ /*padding*/
+ g[6]
+ ), F0(
+ r,
+ "border_focus",
+ /*border_mode*/
+ g[5] === "focus"
+ ), F0(r, "hide-container", !/*explicit_call*/
+ g[8] && !/*container*/
+ g[9]), y & /*height*/
+ 1 && wt(
+ r,
+ "height",
+ /*get_dimension*/
+ g[15](
+ /*height*/
+ g[0]
+ )
+ ), y & /*width*/
+ 2 && wt(r, "width", typeof /*width*/
+ g[1] == "number" ? `calc(min(${/*width*/
+ g[1]}px, 100%))` : (
+ /*get_dimension*/
+ g[15](
+ /*width*/
+ g[1]
+ )
+ )), y & /*variant*/
+ 16 && wt(
+ r,
+ "border-style",
+ /*variant*/
+ g[4]
+ ), y & /*allow_overflow*/
+ 2048 && wt(
+ r,
+ "overflow",
+ /*allow_overflow*/
+ g[11] ? "visible" : "hidden"
+ ), y & /*scale*/
+ 4096 && wt(
+ r,
+ "flex-grow",
+ /*scale*/
+ g[12]
+ ), y & /*min_width*/
+ 8192 && wt(r, "min-width", `calc(min(${/*min_width*/
+ g[13]}px, 100%))`);
+ },
+ i(g) {
+ i || (ao(u, g), i = !0);
+ },
+ o(g) {
+ oo(u, g), i = !1;
+ },
+ d(g) {
+ g && d1(r), u && u.d(g);
+ }
+ };
+}
+function D1(a) {
+ let r, s = (
+ /*tag*/
+ a[14] && x1(a)
+ );
+ return {
+ c() {
+ s && s.c();
+ },
+ m(i, o) {
+ s && s.m(i, o), r = !0;
+ },
+ p(i, [o]) {
+ /*tag*/
+ i[14] && s.p(i, o);
+ },
+ i(i) {
+ r || (ao(s, i), r = !0);
+ },
+ o(i) {
+ oo(s, i), r = !1;
+ },
+ d(i) {
+ s && s.d(i);
+ }
+ };
+}
+function v1(a, r, s) {
+ let { $$slots: i = {}, $$scope: o } = r, { height: u = void 0 } = r, { width: f = void 0 } = r, { elem_id: p = "" } = r, { elem_classes: g = [] } = r, { variant: y = "solid" } = r, { border_mode: D = "base" } = r, { padding: T = !0 } = r, { type: P = "normal" } = r, { test_id: U = void 0 } = r, { explicit_call: K = !1 } = r, { container: ee = !0 } = r, { visible: Z = !0 } = r, { allow_overflow: R = !0 } = r, { scale: N = null } = r, { min_width: S = 0 } = r, M = P === "fieldset" ? "fieldset" : "div";
+ const L = (z) => {
+ if (z !== void 0) {
+ if (typeof z == "number")
+ return z + "px";
+ if (typeof z == "string")
+ return z;
+ }
+ };
+ return a.$$set = (z) => {
+ "height" in z && s(0, u = z.height), "width" in z && s(1, f = z.width), "elem_id" in z && s(2, p = z.elem_id), "elem_classes" in z && s(3, g = z.elem_classes), "variant" in z && s(4, y = z.variant), "border_mode" in z && s(5, D = z.border_mode), "padding" in z && s(6, T = z.padding), "type" in z && s(16, P = z.type), "test_id" in z && s(7, U = z.test_id), "explicit_call" in z && s(8, K = z.explicit_call), "container" in z && s(9, ee = z.container), "visible" in z && s(10, Z = z.visible), "allow_overflow" in z && s(11, R = z.allow_overflow), "scale" in z && s(12, N = z.scale), "min_width" in z && s(13, S = z.min_width), "$$scope" in z && s(17, o = z.$$scope);
+ }, [
+ u,
+ f,
+ p,
+ g,
+ y,
+ D,
+ T,
+ U,
+ K,
+ ee,
+ Z,
+ R,
+ N,
+ S,
+ M,
+ L,
+ P,
+ o,
+ i
+ ];
+}
+class A1 extends c1 {
+ constructor(r) {
+ super(), w1(this, r, v1, D1, _1, {
+ height: 0,
+ width: 1,
+ elem_id: 2,
+ elem_classes: 3,
+ variant: 4,
+ border_mode: 5,
+ padding: 6,
+ type: 16,
+ test_id: 7,
+ explicit_call: 8,
+ container: 9,
+ visible: 10,
+ allow_overflow: 11,
+ scale: 12,
+ min_width: 13
+ });
+ }
+}
+const {
+ SvelteComponent: S1,
+ append: hs,
+ attr: ir,
+ create_component: F1,
+ destroy_component: E1,
+ detach: C1,
+ element: gl,
+ init: T1,
+ insert: M1,
+ mount_component: z1,
+ safe_not_equal: B1,
+ set_data: N1,
+ space: R1,
+ text: I1,
+ toggle_class: E0,
+ transition_in: L1,
+ transition_out: O1
+} = window.__gradio__svelte__internal;
+function q1(a) {
+ let r, s, i, o, u, f;
+ return i = new /*Icon*/
+ a[1]({}), {
+ c() {
+ r = gl("label"), s = gl("span"), F1(i.$$.fragment), o = R1(), u = I1(
+ /*label*/
+ a[0]
+ ), ir(s, "class", "svelte-9gxdi0"), ir(r, "for", ""), ir(r, "data-testid", "block-label"), ir(r, "class", "svelte-9gxdi0"), E0(r, "hide", !/*show_label*/
+ a[2]), E0(r, "sr-only", !/*show_label*/
+ a[2]), E0(
+ r,
+ "float",
+ /*float*/
+ a[4]
+ ), E0(
+ r,
+ "hide-label",
+ /*disable*/
+ a[3]
+ );
+ },
+ m(p, g) {
+ M1(p, r, g), hs(r, s), z1(i, s, null), hs(r, o), hs(r, u), f = !0;
+ },
+ p(p, [g]) {
+ (!f || g & /*label*/
+ 1) && N1(
+ u,
+ /*label*/
+ p[0]
+ ), (!f || g & /*show_label*/
+ 4) && E0(r, "hide", !/*show_label*/
+ p[2]), (!f || g & /*show_label*/
+ 4) && E0(r, "sr-only", !/*show_label*/
+ p[2]), (!f || g & /*float*/
+ 16) && E0(
+ r,
+ "float",
+ /*float*/
+ p[4]
+ ), (!f || g & /*disable*/
+ 8) && E0(
+ r,
+ "hide-label",
+ /*disable*/
+ p[3]
+ );
+ },
+ i(p) {
+ f || (L1(i.$$.fragment, p), f = !0);
+ },
+ o(p) {
+ O1(i.$$.fragment, p), f = !1;
+ },
+ d(p) {
+ p && C1(r), E1(i);
+ }
+ };
+}
+function P1(a, r, s) {
+ let { label: i = null } = r, { Icon: o } = r, { show_label: u = !0 } = r, { disable: f = !1 } = r, { float: p = !0 } = r;
+ return a.$$set = (g) => {
+ "label" in g && s(0, i = g.label), "Icon" in g && s(1, o = g.Icon), "show_label" in g && s(2, u = g.show_label), "disable" in g && s(3, f = g.disable), "float" in g && s(4, p = g.float);
+ }, [i, o, u, f, p];
+}
+class H1 extends S1 {
+ constructor(r) {
+ super(), T1(this, r, P1, q1, B1, {
+ label: 0,
+ Icon: 1,
+ show_label: 2,
+ disable: 3,
+ float: 4
+ });
+ }
+}
+const {
+ SvelteComponent: U1,
+ append: zs,
+ attr: m0,
+ bubble: G1,
+ create_component: V1,
+ destroy_component: W1,
+ detach: uo,
+ element: Bs,
+ init: j1,
+ insert: co,
+ listen: X1,
+ mount_component: Y1,
+ safe_not_equal: Z1,
+ set_data: K1,
+ set_style: lr,
+ space: Q1,
+ text: J1,
+ toggle_class: zt,
+ transition_in: $1,
+ transition_out: ec
+} = window.__gradio__svelte__internal;
+function bl(a) {
+ let r, s;
+ return {
+ c() {
+ r = Bs("span"), s = J1(
+ /*label*/
+ a[1]
+ ), m0(r, "class", "svelte-lpi64a");
+ },
+ m(i, o) {
+ co(i, r, o), zs(r, s);
+ },
+ p(i, o) {
+ o & /*label*/
+ 2 && K1(
+ s,
+ /*label*/
+ i[1]
+ );
+ },
+ d(i) {
+ i && uo(r);
+ }
+ };
+}
+function tc(a) {
+ let r, s, i, o, u, f, p, g = (
+ /*show_label*/
+ a[2] && bl(a)
+ );
+ return o = new /*Icon*/
+ a[0]({}), {
+ c() {
+ r = Bs("button"), g && g.c(), s = Q1(), i = Bs("div"), V1(o.$$.fragment), m0(i, "class", "svelte-lpi64a"), zt(
+ i,
+ "small",
+ /*size*/
+ a[4] === "small"
+ ), zt(
+ i,
+ "large",
+ /*size*/
+ a[4] === "large"
+ ), r.disabled = /*disabled*/
+ a[7], m0(
+ r,
+ "aria-label",
+ /*label*/
+ a[1]
+ ), m0(
+ r,
+ "aria-haspopup",
+ /*hasPopup*/
+ a[8]
+ ), m0(
+ r,
+ "title",
+ /*label*/
+ a[1]
+ ), m0(r, "class", "svelte-lpi64a"), zt(
+ r,
+ "pending",
+ /*pending*/
+ a[3]
+ ), zt(
+ r,
+ "padded",
+ /*padded*/
+ a[5]
+ ), zt(
+ r,
+ "highlight",
+ /*highlight*/
+ a[6]
+ ), zt(
+ r,
+ "transparent",
+ /*transparent*/
+ a[9]
+ ), lr(r, "color", !/*disabled*/
+ a[7] && /*_color*/
+ a[11] ? (
+ /*_color*/
+ a[11]
+ ) : "var(--block-label-text-color)"), lr(r, "--bg-color", /*disabled*/
+ a[7] ? "auto" : (
+ /*background*/
+ a[10]
+ ));
+ },
+ m(y, D) {
+ co(y, r, D), g && g.m(r, null), zs(r, s), zs(r, i), Y1(o, i, null), u = !0, f || (p = X1(
+ r,
+ "click",
+ /*click_handler*/
+ a[13]
+ ), f = !0);
+ },
+ p(y, [D]) {
+ /*show_label*/
+ y[2] ? g ? g.p(y, D) : (g = bl(y), g.c(), g.m(r, s)) : g && (g.d(1), g = null), (!u || D & /*size*/
+ 16) && zt(
+ i,
+ "small",
+ /*size*/
+ y[4] === "small"
+ ), (!u || D & /*size*/
+ 16) && zt(
+ i,
+ "large",
+ /*size*/
+ y[4] === "large"
+ ), (!u || D & /*disabled*/
+ 128) && (r.disabled = /*disabled*/
+ y[7]), (!u || D & /*label*/
+ 2) && m0(
+ r,
+ "aria-label",
+ /*label*/
+ y[1]
+ ), (!u || D & /*hasPopup*/
+ 256) && m0(
+ r,
+ "aria-haspopup",
+ /*hasPopup*/
+ y[8]
+ ), (!u || D & /*label*/
+ 2) && m0(
+ r,
+ "title",
+ /*label*/
+ y[1]
+ ), (!u || D & /*pending*/
+ 8) && zt(
+ r,
+ "pending",
+ /*pending*/
+ y[3]
+ ), (!u || D & /*padded*/
+ 32) && zt(
+ r,
+ "padded",
+ /*padded*/
+ y[5]
+ ), (!u || D & /*highlight*/
+ 64) && zt(
+ r,
+ "highlight",
+ /*highlight*/
+ y[6]
+ ), (!u || D & /*transparent*/
+ 512) && zt(
+ r,
+ "transparent",
+ /*transparent*/
+ y[9]
+ ), D & /*disabled, _color*/
+ 2176 && lr(r, "color", !/*disabled*/
+ y[7] && /*_color*/
+ y[11] ? (
+ /*_color*/
+ y[11]
+ ) : "var(--block-label-text-color)"), D & /*disabled, background*/
+ 1152 && lr(r, "--bg-color", /*disabled*/
+ y[7] ? "auto" : (
+ /*background*/
+ y[10]
+ ));
+ },
+ i(y) {
+ u || ($1(o.$$.fragment, y), u = !0);
+ },
+ o(y) {
+ ec(o.$$.fragment, y), u = !1;
+ },
+ d(y) {
+ y && uo(r), g && g.d(), W1(o), f = !1, p();
+ }
+ };
+}
+function nc(a, r, s) {
+ let i, { Icon: o } = r, { label: u = "" } = r, { show_label: f = !1 } = r, { pending: p = !1 } = r, { size: g = "small" } = r, { padded: y = !0 } = r, { highlight: D = !1 } = r, { disabled: T = !1 } = r, { hasPopup: P = !1 } = r, { color: U = "var(--block-label-text-color)" } = r, { transparent: K = !1 } = r, { background: ee = "var(--background-fill-primary)" } = r;
+ function Z(R) {
+ G1.call(this, a, R);
+ }
+ return a.$$set = (R) => {
+ "Icon" in R && s(0, o = R.Icon), "label" in R && s(1, u = R.label), "show_label" in R && s(2, f = R.show_label), "pending" in R && s(3, p = R.pending), "size" in R && s(4, g = R.size), "padded" in R && s(5, y = R.padded), "highlight" in R && s(6, D = R.highlight), "disabled" in R && s(7, T = R.disabled), "hasPopup" in R && s(8, P = R.hasPopup), "color" in R && s(12, U = R.color), "transparent" in R && s(9, K = R.transparent), "background" in R && s(10, ee = R.background);
+ }, a.$$.update = () => {
+ a.$$.dirty & /*highlight, color*/
+ 4160 && s(11, i = D ? "var(--color-accent)" : U);
+ }, [
+ o,
+ u,
+ f,
+ p,
+ g,
+ y,
+ D,
+ T,
+ P,
+ K,
+ ee,
+ i,
+ U,
+ Z
+ ];
+}
+class rc extends U1 {
+ constructor(r) {
+ super(), j1(this, r, nc, tc, Z1, {
+ Icon: 0,
+ label: 1,
+ show_label: 2,
+ pending: 3,
+ size: 4,
+ padded: 5,
+ highlight: 6,
+ disabled: 7,
+ hasPopup: 8,
+ color: 12,
+ transparent: 9,
+ background: 10
+ });
+ }
+}
+const {
+ SvelteComponent: sc,
+ append: wl,
+ attr: yt,
+ detach: ic,
+ init: lc,
+ insert: ac,
+ noop: fs,
+ safe_not_equal: oc,
+ svg_element: ds
+} = window.__gradio__svelte__internal;
+function uc(a) {
+ let r, s, i;
+ return {
+ c() {
+ r = ds("svg"), s = ds("path"), i = ds("path"), yt(s, "fill", "currentColor"), yt(s, "d", "M17.74 30L16 29l4-7h6a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h9v2H6a4 4 0 0 1-4-4V8a4 4 0 0 1 4-4h20a4 4 0 0 1 4 4v12a4 4 0 0 1-4 4h-4.84Z"), yt(i, "fill", "currentColor"), yt(i, "d", "M8 10h16v2H8zm0 6h10v2H8z"), yt(r, "xmlns", "http://www.w3.org/2000/svg"), yt(r, "xmlns:xlink", "http://www.w3.org/1999/xlink"), yt(r, "aria-hidden", "true"), yt(r, "role", "img"), yt(r, "class", "iconify iconify--carbon"), yt(r, "width", "100%"), yt(r, "height", "100%"), yt(r, "preserveAspectRatio", "xMidYMid meet"), yt(r, "viewBox", "0 0 32 32");
+ },
+ m(o, u) {
+ ac(o, r, u), wl(r, s), wl(r, i);
+ },
+ p: fs,
+ i: fs,
+ o: fs,
+ d(o) {
+ o && ic(r);
+ }
+ };
+}
+class cc extends sc {
+ constructor(r) {
+ super(), lc(this, r, null, uc, oc, {});
+ }
+}
+const {
+ SvelteComponent: hc,
+ append: fc,
+ attr: C0,
+ detach: dc,
+ init: mc,
+ insert: pc,
+ noop: ms,
+ safe_not_equal: gc,
+ svg_element: yl
+} = window.__gradio__svelte__internal;
+function bc(a) {
+ let r, s;
+ return {
+ c() {
+ r = yl("svg"), s = yl("polyline"), C0(s, "points", "20 6 9 17 4 12"), C0(r, "xmlns", "http://www.w3.org/2000/svg"), C0(r, "viewBox", "2 0 20 20"), C0(r, "fill", "none"), C0(r, "stroke", "currentColor"), C0(r, "stroke-width", "3"), C0(r, "stroke-linecap", "round"), C0(r, "stroke-linejoin", "round");
+ },
+ m(i, o) {
+ pc(i, r, o), fc(r, s);
+ },
+ p: ms,
+ i: ms,
+ o: ms,
+ d(i) {
+ i && dc(r);
+ }
+ };
+}
+class wc extends hc {
+ constructor(r) {
+ super(), mc(this, r, null, bc, gc, {});
+ }
+}
+const {
+ SvelteComponent: yc,
+ append: _c,
+ attr: vn,
+ detach: kc,
+ init: xc,
+ insert: Dc,
+ noop: ps,
+ safe_not_equal: vc,
+ svg_element: _l
+} = window.__gradio__svelte__internal;
+function Ac(a) {
+ let r, s;
+ return {
+ c() {
+ r = _l("svg"), s = _l("path"), vn(s, "d", "M23,20a5,5,0,0,0-3.89,1.89L11.8,17.32a4.46,4.46,0,0,0,0-2.64l7.31-4.57A5,5,0,1,0,18,7a4.79,4.79,0,0,0,.2,1.32l-7.31,4.57a5,5,0,1,0,0,6.22l7.31,4.57A4.79,4.79,0,0,0,18,25a5,5,0,1,0,5-5ZM23,4a3,3,0,1,1-3,3A3,3,0,0,1,23,4ZM7,19a3,3,0,1,1,3-3A3,3,0,0,1,7,19Zm16,9a3,3,0,1,1,3-3A3,3,0,0,1,23,28Z"), vn(s, "fill", "currentColor"), vn(r, "id", "icon"), vn(r, "xmlns", "http://www.w3.org/2000/svg"), vn(r, "viewBox", "0 0 32 32");
+ },
+ m(i, o) {
+ Dc(i, r, o), _c(r, s);
+ },
+ p: ps,
+ i: ps,
+ o: ps,
+ d(i) {
+ i && kc(r);
+ }
+ };
+}
+class Sc extends yc {
+ constructor(r) {
+ super(), xc(this, r, null, Ac, vc, {});
+ }
+}
+const {
+ SvelteComponent: Fc,
+ append: kl,
+ attr: H0,
+ detach: Ec,
+ init: Cc,
+ insert: Tc,
+ noop: gs,
+ safe_not_equal: Mc,
+ svg_element: bs
+} = window.__gradio__svelte__internal;
+function zc(a) {
+ let r, s, i;
+ return {
+ c() {
+ r = bs("svg"), s = bs("path"), i = bs("path"), H0(s, "fill", "currentColor"), H0(s, "d", "M28 10v18H10V10h18m0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2Z"), H0(i, "fill", "currentColor"), H0(i, "d", "M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"), H0(r, "xmlns", "http://www.w3.org/2000/svg"), H0(r, "viewBox", "0 0 33 33"), H0(r, "color", "currentColor");
+ },
+ m(o, u) {
+ Tc(o, r, u), kl(r, s), kl(r, i);
+ },
+ p: gs,
+ i: gs,
+ o: gs,
+ d(o) {
+ o && Ec(r);
+ }
+ };
+}
+class Bc extends Fc {
+ constructor(r) {
+ super(), Cc(this, r, null, zc, Mc, {});
+ }
+}
+const {
+ SvelteComponent: Nc,
+ append: xl,
+ attr: at,
+ detach: Rc,
+ init: Ic,
+ insert: Lc,
+ noop: Dl,
+ safe_not_equal: Oc,
+ svg_element: ws
+} = window.__gradio__svelte__internal;
+function qc(a) {
+ let r, s, i, o;
+ return {
+ c() {
+ r = ws("svg"), s = ws("path"), i = ws("path"), at(s, "stroke", "currentColor"), at(s, "stroke-width", "1.5"), at(s, "stroke-linecap", "round"), at(s, "d", "M16.472 3.5H4.1a.6.6 0 0 0-.6.6v9.8a.6.6 0 0 0 .6.6h2.768a2 2 0 0 1 1.715.971l2.71 4.517a1.631 1.631 0 0 0 2.961-1.308l-1.022-3.408a.6.6 0 0 1 .574-.772h4.575a2 2 0 0 0 1.93-2.526l-1.91-7A2 2 0 0 0 16.473 3.5Z"), at(i, "stroke", "currentColor"), at(i, "stroke-width", "1.5"), at(i, "stroke-linecap", "round"), at(i, "stroke-linejoin", "round"), at(i, "d", "M7 14.5v-11"), at(r, "xmlns", "http://www.w3.org/2000/svg"), at(r, "viewBox", "0 0 24 24"), at(r, "fill", o = /*selected*/
+ a[0] ? "currentColor" : "none"), at(r, "stroke-width", "1.5"), at(r, "color", "currentColor");
+ },
+ m(u, f) {
+ Lc(u, r, f), xl(r, s), xl(r, i);
+ },
+ p(u, [f]) {
+ f & /*selected*/
+ 1 && o !== (o = /*selected*/
+ u[0] ? "currentColor" : "none") && at(r, "fill", o);
+ },
+ i: Dl,
+ o: Dl,
+ d(u) {
+ u && Rc(r);
+ }
+ };
+}
+function Pc(a, r, s) {
+ let { selected: i } = r;
+ return a.$$set = (o) => {
+ "selected" in o && s(0, i = o.selected);
+ }, [i];
+}
+class Hc extends Nc {
+ constructor(r) {
+ super(), Ic(this, r, Pc, qc, Oc, { selected: 0 });
+ }
+}
+const {
+ SvelteComponent: Uc,
+ append: vl,
+ attr: ot,
+ detach: Gc,
+ init: Vc,
+ insert: Wc,
+ noop: Al,
+ safe_not_equal: jc,
+ svg_element: ys
+} = window.__gradio__svelte__internal;
+function Xc(a) {
+ let r, s, i, o;
+ return {
+ c() {
+ r = ys("svg"), s = ys("path"), i = ys("path"), ot(s, "stroke", "currentColor"), ot(s, "stroke-width", "1.5"), ot(s, "stroke-linecap", "round"), ot(s, "d", "M16.472 20H4.1a.6.6 0 0 1-.6-.6V9.6a.6.6 0 0 1 .6-.6h2.768a2 2 0 0 0 1.715-.971l2.71-4.517a1.631 1.631 0 0 1 2.961 1.308l-1.022 3.408a.6.6 0 0 0 .574.772h4.575a2 2 0 0 1 1.93 2.526l-1.91 7A2 2 0 0 1 16.473 20Z"), ot(i, "stroke", "currentColor"), ot(i, "stroke-width", "1.5"), ot(i, "stroke-linecap", "round"), ot(i, "stroke-linejoin", "round"), ot(i, "d", "M7 20V9"), ot(r, "xmlns", "http://www.w3.org/2000/svg"), ot(r, "viewBox", "0 0 24 24"), ot(r, "fill", o = /*selected*/
+ a[0] ? "currentColor" : "none"), ot(r, "stroke-width", "1.5"), ot(r, "color", "currentColor");
+ },
+ m(u, f) {
+ Wc(u, r, f), vl(r, s), vl(r, i);
+ },
+ p(u, [f]) {
+ f & /*selected*/
+ 1 && o !== (o = /*selected*/
+ u[0] ? "currentColor" : "none") && ot(r, "fill", o);
+ },
+ i: Al,
+ o: Al,
+ d(u) {
+ u && Gc(r);
+ }
+ };
+}
+function Yc(a, r, s) {
+ let { selected: i } = r;
+ return a.$$set = (o) => {
+ "selected" in o && s(0, i = o.selected);
+ }, [i];
+}
+class Zc extends Uc {
+ constructor(r) {
+ super(), Vc(this, r, Yc, Xc, jc, { selected: 0 });
+ }
+}
+const {
+ SvelteComponent: Kc,
+ create_component: Qc,
+ destroy_component: Jc,
+ init: $c,
+ mount_component: e4,
+ safe_not_equal: t4,
+ transition_in: n4,
+ transition_out: r4
+} = window.__gradio__svelte__internal, { createEventDispatcher: s4 } = window.__gradio__svelte__internal;
+function i4(a) {
+ let r, s;
+ return r = new rc({
+ props: {
+ Icon: Sc,
+ label: (
+ /*i18n*/
+ a[2]("common.share")
+ ),
+ pending: (
+ /*pending*/
+ a[3]
+ )
+ }
+ }), r.$on(
+ "click",
+ /*click_handler*/
+ a[5]
+ ), {
+ c() {
+ Qc(r.$$.fragment);
+ },
+ m(i, o) {
+ e4(r, i, o), s = !0;
+ },
+ p(i, [o]) {
+ const u = {};
+ o & /*i18n*/
+ 4 && (u.label = /*i18n*/
+ i[2]("common.share")), o & /*pending*/
+ 8 && (u.pending = /*pending*/
+ i[3]), r.$set(u);
+ },
+ i(i) {
+ s || (n4(r.$$.fragment, i), s = !0);
+ },
+ o(i) {
+ r4(r.$$.fragment, i), s = !1;
+ },
+ d(i) {
+ Jc(r, i);
+ }
+ };
+}
+function l4(a, r, s) {
+ const i = s4();
+ let { formatter: o } = r, { value: u } = r, { i18n: f } = r, p = !1;
+ const g = async () => {
+ try {
+ s(3, p = !0);
+ const y = await o(u);
+ i("share", { description: y });
+ } catch (y) {
+ console.error(y);
+ let D = y instanceof gr ? y.message : "Share failed.";
+ i("error", D);
+ } finally {
+ s(3, p = !1);
+ }
+ };
+ return a.$$set = (y) => {
+ "formatter" in y && s(0, o = y.formatter), "value" in y && s(1, u = y.value), "i18n" in y && s(2, f = y.i18n);
+ }, [o, u, f, p, i, g];
+}
+class a4 extends Kc {
+ constructor(r) {
+ super(), $c(this, r, l4, i4, t4, { formatter: 0, value: 1, i18n: 2 });
+ }
+}
+const { setContext: g3, getContext: o4 } = window.__gradio__svelte__internal, u4 = "WORKER_PROXY_CONTEXT_KEY";
+function c4() {
+ return o4(u4);
+}
+function h4(a) {
+ return a.host === window.location.host || a.host === "localhost:7860" || a.host === "127.0.0.1:7860" || // Ref: https://github.com/gradio-app/gradio/blob/v3.32.0/js/app/src/Index.svelte#L194
+ a.host === "lite.local";
+}
+function f4(a, r) {
+ const s = r.toLowerCase();
+ for (const [i, o] of Object.entries(a))
+ if (i.toLowerCase() === s)
+ return o;
+}
+function d4(a) {
+ if (a == null)
+ return !1;
+ const r = new URL(a, window.location.href);
+ return !(!h4(r) || r.protocol !== "http:" && r.protocol !== "https:");
+}
+async function m4(a) {
+ if (a == null || !d4(a))
+ return a;
+ const r = c4();
+ if (r == null)
+ return a;
+ const i = new URL(a, window.location.href).pathname;
+ return r.httpRequest({
+ method: "GET",
+ path: i,
+ headers: {},
+ query_string: ""
+ }).then((o) => {
+ if (o.status !== 200)
+ throw new Error(`Failed to get file ${i} from the Wasm worker.`);
+ const u = new Blob([o.body], {
+ type: f4(o.headers, "content-type")
+ });
+ return URL.createObjectURL(u);
+ });
+}
+const {
+ SvelteComponent: p4,
+ assign: Ns,
+ compute_rest_props: Sl,
+ detach: g4,
+ element: b4,
+ exclude_internal_props: w4,
+ get_spread_update: y4,
+ init: _4,
+ insert: k4,
+ noop: Fl,
+ safe_not_equal: x4,
+ set_attributes: El,
+ src_url_equal: D4,
+ toggle_class: Cl
+} = window.__gradio__svelte__internal;
+function v4(a) {
+ let r, s, i = [
+ {
+ src: s = /*resolved_src*/
+ a[0]
+ },
+ /*$$restProps*/
+ a[1]
+ ], o = {};
+ for (let u = 0; u < i.length; u += 1)
+ o = Ns(o, i[u]);
+ return {
+ c() {
+ r = b4("img"), El(r, o), Cl(r, "svelte-kxeri3", !0);
+ },
+ m(u, f) {
+ k4(u, r, f);
+ },
+ p(u, [f]) {
+ El(r, o = y4(i, [
+ f & /*resolved_src*/
+ 1 && !D4(r.src, s = /*resolved_src*/
+ u[0]) && { src: s },
+ f & /*$$restProps*/
+ 2 && /*$$restProps*/
+ u[1]
+ ])), Cl(r, "svelte-kxeri3", !0);
+ },
+ i: Fl,
+ o: Fl,
+ d(u) {
+ u && g4(r);
+ }
+ };
+}
+function A4(a, r, s) {
+ const i = ["src"];
+ let o = Sl(r, i), { src: u = void 0 } = r, f, p;
+ return a.$$set = (g) => {
+ r = Ns(Ns({}, r), w4(g)), s(1, o = Sl(r, i)), "src" in g && s(2, u = g.src);
+ }, a.$$.update = () => {
+ if (a.$$.dirty & /*src, latest_src*/
+ 12) {
+ s(0, f = u), s(3, p = u);
+ const g = u;
+ m4(g).then((y) => {
+ p === g && s(0, f = y);
+ });
+ }
+ }, [f, o, u, p];
+}
+class S4 extends p4 {
+ constructor(r) {
+ super(), _4(this, r, A4, v4, x4, { src: 2 });
+ }
+}
+var Tl;
+(function(a) {
+ a.LOAD = "LOAD", a.EXEC = "EXEC", a.WRITE_FILE = "WRITE_FILE", a.READ_FILE = "READ_FILE", a.DELETE_FILE = "DELETE_FILE", a.RENAME = "RENAME", a.CREATE_DIR = "CREATE_DIR", a.LIST_DIR = "LIST_DIR", a.DELETE_DIR = "DELETE_DIR", a.ERROR = "ERROR", a.DOWNLOAD = "DOWNLOAD", a.PROGRESS = "PROGRESS", a.LOG = "LOG", a.MOUNT = "MOUNT", a.UNMOUNT = "UNMOUNT";
+})(Tl || (Tl = {}));
+/*! @license DOMPurify 3.0.11 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.0.11/LICENSE */
+const {
+ entries: ho,
+ setPrototypeOf: Ml,
+ isFrozen: F4,
+ getPrototypeOf: E4,
+ getOwnPropertyDescriptor: C4
+} = Object;
+let {
+ freeze: ut,
+ seal: It,
+ create: fo
+} = Object, {
+ apply: Rs,
+ construct: Is
+} = typeof Reflect < "u" && Reflect;
+ut || (ut = function(r) {
+ return r;
+});
+It || (It = function(r) {
+ return r;
+});
+Rs || (Rs = function(r, s, i) {
+ return r.apply(s, i);
+});
+Is || (Is = function(r, s) {
+ return new r(...s);
+});
+const ar = Dt(Array.prototype.forEach), zl = Dt(Array.prototype.pop), An = Dt(Array.prototype.push), br = Dt(String.prototype.toLowerCase), _s = Dt(String.prototype.toString), Bl = Dt(String.prototype.match), Sn = Dt(String.prototype.replace), T4 = Dt(String.prototype.indexOf), M4 = Dt(String.prototype.trim), Vt = Dt(Object.prototype.hasOwnProperty), _t = Dt(RegExp.prototype.test), Fn = z4(TypeError);
+function Dt(a) {
+ return function(r) {
+ for (var s = arguments.length, i = new Array(s > 1 ? s - 1 : 0), o = 1; o < s; o++)
+ i[o - 1] = arguments[o];
+ return Rs(a, r, i);
+ };
+}
+function z4(a) {
+ return function() {
+ for (var r = arguments.length, s = new Array(r), i = 0; i < r; i++)
+ s[i] = arguments[i];
+ return Is(a, s);
+ };
+}
+function ye(a, r) {
+ let s = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : br;
+ Ml && Ml(a, null);
+ let i = r.length;
+ for (; i--; ) {
+ let o = r[i];
+ if (typeof o == "string") {
+ const u = s(o);
+ u !== o && (F4(r) || (r[i] = u), o = u);
+ }
+ a[o] = !0;
+ }
+ return a;
+}
+function B4(a) {
+ for (let r = 0; r < a.length; r++)
+ Vt(a, r) || (a[r] = null);
+ return a;
+}
+function U0(a) {
+ const r = fo(null);
+ for (const [s, i] of ho(a))
+ Vt(a, s) && (Array.isArray(i) ? r[s] = B4(i) : i && typeof i == "object" && i.constructor === Object ? r[s] = U0(i) : r[s] = i);
+ return r;
+}
+function or(a, r) {
+ for (; a !== null; ) {
+ const i = C4(a, r);
+ if (i) {
+ if (i.get)
+ return Dt(i.get);
+ if (typeof i.value == "function")
+ return Dt(i.value);
+ }
+ a = E4(a);
+ }
+ function s() {
+ return null;
+ }
+ return s;
+}
+const Nl = ut(["a", "abbr", "acronym", "address", "area", "article", "aside", "audio", "b", "bdi", "bdo", "big", "blink", "blockquote", "body", "br", "button", "canvas", "caption", "center", "cite", "code", "col", "colgroup", "content", "data", "datalist", "dd", "decorator", "del", "details", "dfn", "dialog", "dir", "div", "dl", "dt", "element", "em", "fieldset", "figcaption", "figure", "font", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "i", "img", "input", "ins", "kbd", "label", "legend", "li", "main", "map", "mark", "marquee", "menu", "menuitem", "meter", "nav", "nobr", "ol", "optgroup", "option", "output", "p", "picture", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "section", "select", "shadow", "small", "source", "spacer", "span", "strike", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "time", "tr", "track", "tt", "u", "ul", "var", "video", "wbr"]), ks = ut(["svg", "a", "altglyph", "altglyphdef", "altglyphitem", "animatecolor", "animatemotion", "animatetransform", "circle", "clippath", "defs", "desc", "ellipse", "filter", "font", "g", "glyph", "glyphref", "hkern", "image", "line", "lineargradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialgradient", "rect", "stop", "style", "switch", "symbol", "text", "textpath", "title", "tref", "tspan", "view", "vkern"]), xs = ut(["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence"]), N4 = ut(["animate", "color-profile", "cursor", "discard", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignobject", "hatch", "hatchpath", "mesh", "meshgradient", "meshpatch", "meshrow", "missing-glyph", "script", "set", "solidcolor", "unknown", "use"]), Ds = ut(["math", "menclose", "merror", "mfenced", "mfrac", "mglyph", "mi", "mlabeledtr", "mmultiscripts", "mn", "mo", "mover", "mpadded", "mphantom", "mroot", "mrow", "ms", "mspace", "msqrt", "mstyle", "msub", "msup", "msubsup", "mtable", "mtd", "mtext", "mtr", "munder", "munderover", "mprescripts"]), R4 = ut(["maction", "maligngroup", "malignmark", "mlongdiv", "mscarries", "mscarry", "msgroup", "mstack", "msline", "msrow", "semantics", "annotation", "annotation-xml", "mprescripts", "none"]), Rl = ut(["#text"]), Il = ut(["accept", "action", "align", "alt", "autocapitalize", "autocomplete", "autopictureinpicture", "autoplay", "background", "bgcolor", "border", "capture", "cellpadding", "cellspacing", "checked", "cite", "class", "clear", "color", "cols", "colspan", "controls", "controlslist", "coords", "crossorigin", "datetime", "decoding", "default", "dir", "disabled", "disablepictureinpicture", "disableremoteplayback", "download", "draggable", "enctype", "enterkeyhint", "face", "for", "headers", "height", "hidden", "high", "href", "hreflang", "id", "inputmode", "integrity", "ismap", "kind", "label", "lang", "list", "loading", "loop", "low", "max", "maxlength", "media", "method", "min", "minlength", "multiple", "muted", "name", "nonce", "noshade", "novalidate", "nowrap", "open", "optimum", "pattern", "placeholder", "playsinline", "poster", "preload", "pubdate", "radiogroup", "readonly", "rel", "required", "rev", "reversed", "role", "rows", "rowspan", "spellcheck", "scope", "selected", "shape", "size", "sizes", "span", "srclang", "start", "src", "srcset", "step", "style", "summary", "tabindex", "title", "translate", "type", "usemap", "valign", "value", "width", "xmlns", "slot"]), vs = ut(["accent-height", "accumulate", "additive", "alignment-baseline", "ascent", "attributename", "attributetype", "azimuth", "basefrequency", "baseline-shift", "begin", "bias", "by", "class", "clip", "clippathunits", "clip-path", "clip-rule", "color", "color-interpolation", "color-interpolation-filters", "color-profile", "color-rendering", "cx", "cy", "d", "dx", "dy", "diffuseconstant", "direction", "display", "divisor", "dur", "edgemode", "elevation", "end", "fill", "fill-opacity", "fill-rule", "filter", "filterunits", "flood-color", "flood-opacity", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "fx", "fy", "g1", "g2", "glyph-name", "glyphref", "gradientunits", "gradienttransform", "height", "href", "id", "image-rendering", "in", "in2", "k", "k1", "k2", "k3", "k4", "kerning", "keypoints", "keysplines", "keytimes", "lang", "lengthadjust", "letter-spacing", "kernelmatrix", "kernelunitlength", "lighting-color", "local", "marker-end", "marker-mid", "marker-start", "markerheight", "markerunits", "markerwidth", "maskcontentunits", "maskunits", "max", "mask", "media", "method", "mode", "min", "name", "numoctaves", "offset", "operator", "opacity", "order", "orient", "orientation", "origin", "overflow", "paint-order", "path", "pathlength", "patterncontentunits", "patterntransform", "patternunits", "points", "preservealpha", "preserveaspectratio", "primitiveunits", "r", "rx", "ry", "radius", "refx", "refy", "repeatcount", "repeatdur", "restart", "result", "rotate", "scale", "seed", "shape-rendering", "specularconstant", "specularexponent", "spreadmethod", "startoffset", "stddeviation", "stitchtiles", "stop-color", "stop-opacity", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke", "stroke-width", "style", "surfacescale", "systemlanguage", "tabindex", "targetx", "targety", "transform", "transform-origin", "text-anchor", "text-decoration", "text-rendering", "textlength", "type", "u1", "u2", "unicode", "values", "viewbox", "visibility", "version", "vert-adv-y", "vert-origin-x", "vert-origin-y", "width", "word-spacing", "wrap", "writing-mode", "xchannelselector", "ychannelselector", "x", "x1", "x2", "xmlns", "y", "y1", "y2", "z", "zoomandpan"]), Ll = ut(["accent", "accentunder", "align", "bevelled", "close", "columnsalign", "columnlines", "columnspan", "denomalign", "depth", "dir", "display", "displaystyle", "encoding", "fence", "frame", "height", "href", "id", "largeop", "length", "linethickness", "lspace", "lquote", "mathbackground", "mathcolor", "mathsize", "mathvariant", "maxsize", "minsize", "movablelimits", "notation", "numalign", "open", "rowalign", "rowlines", "rowspacing", "rowspan", "rspace", "rquote", "scriptlevel", "scriptminsize", "scriptsizemultiplier", "selection", "separator", "separators", "stretchy", "subscriptshift", "supscriptshift", "symmetric", "voffset", "width", "xmlns"]), ur = ut(["xlink:href", "xml:id", "xlink:title", "xml:space", "xmlns:xlink"]), I4 = It(/\{\{[\w\W]*|[\w\W]*\}\}/gm), L4 = It(/<%[\w\W]*|[\w\W]*%>/gm), O4 = It(/\${[\w\W]*}/gm), q4 = It(/^data-[\-\w.\u00B7-\uFFFF]/), P4 = It(/^aria-[\-\w]+$/), mo = It(
+ /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i
+ // eslint-disable-line no-useless-escape
+), H4 = It(/^(?:\w+script|data):/i), U4 = It(
+ /[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g
+ // eslint-disable-line no-control-regex
+), po = It(/^html$/i), G4 = It(/^[a-z][.\w]*(-[.\w]+)+$/i);
+var Ol = /* @__PURE__ */ Object.freeze({
+ __proto__: null,
+ MUSTACHE_EXPR: I4,
+ ERB_EXPR: L4,
+ TMPLIT_EXPR: O4,
+ DATA_ATTR: q4,
+ ARIA_ATTR: P4,
+ IS_ALLOWED_URI: mo,
+ IS_SCRIPT_OR_DATA: H4,
+ ATTR_WHITESPACE: U4,
+ DOCTYPE_NAME: po,
+ CUSTOM_ELEMENT: G4
+});
+const V4 = function() {
+ return typeof window > "u" ? null : window;
+}, W4 = function(r, s) {
+ if (typeof r != "object" || typeof r.createPolicy != "function")
+ return null;
+ let i = null;
+ const o = "data-tt-policy-suffix";
+ s && s.hasAttribute(o) && (i = s.getAttribute(o));
+ const u = "dompurify" + (i ? "#" + i : "");
+ try {
+ return r.createPolicy(u, {
+ createHTML(f) {
+ return f;
+ },
+ createScriptURL(f) {
+ return f;
+ }
+ });
+ } catch {
+ return console.warn("TrustedTypes policy " + u + " could not be created."), null;
+ }
+};
+function go() {
+ let a = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : V4();
+ const r = (G) => go(G);
+ if (r.version = "3.0.11", r.removed = [], !a || !a.document || a.document.nodeType !== 9)
+ return r.isSupported = !1, r;
+ let {
+ document: s
+ } = a;
+ const i = s, o = i.currentScript, {
+ DocumentFragment: u,
+ HTMLTemplateElement: f,
+ Node: p,
+ Element: g,
+ NodeFilter: y,
+ NamedNodeMap: D = a.NamedNodeMap || a.MozNamedAttrMap,
+ HTMLFormElement: T,
+ DOMParser: P,
+ trustedTypes: U
+ } = a, K = g.prototype, ee = or(K, "cloneNode"), Z = or(K, "nextSibling"), R = or(K, "childNodes"), N = or(K, "parentNode");
+ if (typeof f == "function") {
+ const G = s.createElement("template");
+ G.content && G.content.ownerDocument && (s = G.content.ownerDocument);
+ }
+ let S, M = "";
+ const {
+ implementation: L,
+ createNodeIterator: z,
+ createDocumentFragment: H,
+ getElementsByTagName: te
+ } = s, {
+ importNode: Q
+ } = i;
+ let ce = {};
+ r.isSupported = typeof ho == "function" && typeof N == "function" && L && L.createHTMLDocument !== void 0;
+ const {
+ MUSTACHE_EXPR: oe,
+ ERB_EXPR: Ce,
+ TMPLIT_EXPR: ke,
+ DATA_ATTR: Pe,
+ ARIA_ATTR: et,
+ IS_SCRIPT_OR_DATA: vt,
+ ATTR_WHITESPACE: mt,
+ CUSTOM_ELEMENT: Be
+ } = Ol;
+ let {
+ IS_ALLOWED_URI: J
+ } = Ol, _e = null;
+ const ae = ye({}, [...Nl, ...ks, ...xs, ...Ds, ...Rl]);
+ let X = null;
+ const ie = ye({}, [...Il, ...vs, ...Ll, ...ur]);
+ let he = Object.seal(fo(null, {
+ tagNameCheck: {
+ writable: !0,
+ configurable: !1,
+ enumerable: !0,
+ value: null
+ },
+ attributeNameCheck: {
+ writable: !0,
+ configurable: !1,
+ enumerable: !0,
+ value: null
+ },
+ allowCustomizedBuiltInElements: {
+ writable: !0,
+ configurable: !1,
+ enumerable: !0,
+ value: !1
+ }
+ })), tt = null, it = null, l0 = !0, a0 = !0, I0 = !1, g0 = !0, pt = !1, Ot = !1, o0 = !1, pn = !1, b0 = !1, L0 = !1, K0 = !1, w0 = !0, gt = !1;
+ const Q0 = "user-content-";
+ let J0 = !0, O0 = !1, Wt = {}, jt = null;
+ const Rn = ye({}, ["annotation-xml", "audio", "colgroup", "desc", "foreignobject", "head", "iframe", "math", "mi", "mn", "mo", "ms", "mtext", "noembed", "noframes", "noscript", "plaintext", "script", "style", "svg", "template", "thead", "title", "video", "xmp"]);
+ let In = null;
+ const gn = ye({}, ["audio", "video", "img", "source", "image", "track"]);
+ let $0 = null;
+ const At = ye({}, ["alt", "class", "for", "id", "label", "name", "pattern", "placeholder", "role", "summary", "title", "value", "style", "xmlns"]), en = "http://www.w3.org/1998/Math/MathML", y0 = "http://www.w3.org/2000/svg", qt = "http://www.w3.org/1999/xhtml";
+ let u0 = qt, Ne = !1, $ = null;
+ const Xt = ye({}, [en, y0, qt], _s);
+ let _0 = null;
+ const Ln = ["application/xhtml+xml", "text/html"], On = "text/html";
+ let Ge = null, Yt = null;
+ const Tr = s.createElement("form"), qn = function(C) {
+ return C instanceof RegExp || C instanceof Function;
+ }, st = function() {
+ let C = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
+ if (!(Yt && Yt === C)) {
+ if ((!C || typeof C != "object") && (C = {}), C = U0(C), _0 = // eslint-disable-next-line unicorn/prefer-includes
+ Ln.indexOf(C.PARSER_MEDIA_TYPE) === -1 ? On : C.PARSER_MEDIA_TYPE, Ge = _0 === "application/xhtml+xml" ? _s : br, _e = Vt(C, "ALLOWED_TAGS") ? ye({}, C.ALLOWED_TAGS, Ge) : ae, X = Vt(C, "ALLOWED_ATTR") ? ye({}, C.ALLOWED_ATTR, Ge) : ie, $ = Vt(C, "ALLOWED_NAMESPACES") ? ye({}, C.ALLOWED_NAMESPACES, _s) : Xt, $0 = Vt(C, "ADD_URI_SAFE_ATTR") ? ye(
+ U0(At),
+ // eslint-disable-line indent
+ C.ADD_URI_SAFE_ATTR,
+ // eslint-disable-line indent
+ Ge
+ // eslint-disable-line indent
+ ) : At, In = Vt(C, "ADD_DATA_URI_TAGS") ? ye(
+ U0(gn),
+ // eslint-disable-line indent
+ C.ADD_DATA_URI_TAGS,
+ // eslint-disable-line indent
+ Ge
+ // eslint-disable-line indent
+ ) : gn, jt = Vt(C, "FORBID_CONTENTS") ? ye({}, C.FORBID_CONTENTS, Ge) : Rn, tt = Vt(C, "FORBID_TAGS") ? ye({}, C.FORBID_TAGS, Ge) : {}, it = Vt(C, "FORBID_ATTR") ? ye({}, C.FORBID_ATTR, Ge) : {}, Wt = Vt(C, "USE_PROFILES") ? C.USE_PROFILES : !1, l0 = C.ALLOW_ARIA_ATTR !== !1, a0 = C.ALLOW_DATA_ATTR !== !1, I0 = C.ALLOW_UNKNOWN_PROTOCOLS || !1, g0 = C.ALLOW_SELF_CLOSE_IN_ATTR !== !1, pt = C.SAFE_FOR_TEMPLATES || !1, Ot = C.WHOLE_DOCUMENT || !1, b0 = C.RETURN_DOM || !1, L0 = C.RETURN_DOM_FRAGMENT || !1, K0 = C.RETURN_TRUSTED_TYPE || !1, pn = C.FORCE_BODY || !1, w0 = C.SANITIZE_DOM !== !1, gt = C.SANITIZE_NAMED_PROPS || !1, J0 = C.KEEP_CONTENT !== !1, O0 = C.IN_PLACE || !1, J = C.ALLOWED_URI_REGEXP || mo, u0 = C.NAMESPACE || qt, he = C.CUSTOM_ELEMENT_HANDLING || {}, C.CUSTOM_ELEMENT_HANDLING && qn(C.CUSTOM_ELEMENT_HANDLING.tagNameCheck) && (he.tagNameCheck = C.CUSTOM_ELEMENT_HANDLING.tagNameCheck), C.CUSTOM_ELEMENT_HANDLING && qn(C.CUSTOM_ELEMENT_HANDLING.attributeNameCheck) && (he.attributeNameCheck = C.CUSTOM_ELEMENT_HANDLING.attributeNameCheck), C.CUSTOM_ELEMENT_HANDLING && typeof C.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements == "boolean" && (he.allowCustomizedBuiltInElements = C.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements), pt && (a0 = !1), L0 && (b0 = !0), Wt && (_e = ye({}, Rl), X = [], Wt.html === !0 && (ye(_e, Nl), ye(X, Il)), Wt.svg === !0 && (ye(_e, ks), ye(X, vs), ye(X, ur)), Wt.svgFilters === !0 && (ye(_e, xs), ye(X, vs), ye(X, ur)), Wt.mathMl === !0 && (ye(_e, Ds), ye(X, Ll), ye(X, ur))), C.ADD_TAGS && (_e === ae && (_e = U0(_e)), ye(_e, C.ADD_TAGS, Ge)), C.ADD_ATTR && (X === ie && (X = U0(X)), ye(X, C.ADD_ATTR, Ge)), C.ADD_URI_SAFE_ATTR && ye($0, C.ADD_URI_SAFE_ATTR, Ge), C.FORBID_CONTENTS && (jt === Rn && (jt = U0(jt)), ye(jt, C.FORBID_CONTENTS, Ge)), J0 && (_e["#text"] = !0), Ot && ye(_e, ["html", "head", "body"]), _e.table && (ye(_e, ["tbody"]), delete tt.tbody), C.TRUSTED_TYPES_POLICY) {
+ if (typeof C.TRUSTED_TYPES_POLICY.createHTML != "function")
+ throw Fn('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');
+ if (typeof C.TRUSTED_TYPES_POLICY.createScriptURL != "function")
+ throw Fn('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');
+ S = C.TRUSTED_TYPES_POLICY, M = S.createHTML("");
+ } else
+ S === void 0 && (S = W4(U, o)), S !== null && typeof M == "string" && (M = S.createHTML(""));
+ ut && ut(C), Yt = C;
+ }
+ }, St = ye({}, ["mi", "mo", "mn", "ms", "mtext"]), Pt = ye({}, ["foreignobject", "desc", "title", "annotation-xml"]), bn = ye({}, ["title", "style", "font", "a", "script"]), wn = ye({}, [...ks, ...xs, ...N4]), Pn = ye({}, [...Ds, ...R4]), Mr = function(C) {
+ let j = N(C);
+ (!j || !j.tagName) && (j = {
+ namespaceURI: u0,
+ tagName: "template"
+ });
+ const le = br(C.tagName), v = br(j.tagName);
+ return $[C.namespaceURI] ? C.namespaceURI === y0 ? j.namespaceURI === qt ? le === "svg" : j.namespaceURI === en ? le === "svg" && (v === "annotation-xml" || St[v]) : !!wn[le] : C.namespaceURI === en ? j.namespaceURI === qt ? le === "math" : j.namespaceURI === y0 ? le === "math" && Pt[v] : !!Pn[le] : C.namespaceURI === qt ? j.namespaceURI === y0 && !Pt[v] || j.namespaceURI === en && !St[v] ? !1 : !Pn[le] && (bn[le] || !wn[le]) : !!(_0 === "application/xhtml+xml" && $[C.namespaceURI]) : !1;
+ }, Zt = function(C) {
+ An(r.removed, {
+ element: C
+ });
+ try {
+ C.parentNode.removeChild(C);
+ } catch {
+ C.remove();
+ }
+ }, k0 = function(C, j) {
+ try {
+ An(r.removed, {
+ attribute: j.getAttributeNode(C),
+ from: j
+ });
+ } catch {
+ An(r.removed, {
+ attribute: null,
+ from: j
+ });
+ }
+ if (j.removeAttribute(C), C === "is" && !X[C])
+ if (b0 || L0)
+ try {
+ Zt(j);
+ } catch {
+ }
+ else
+ try {
+ j.setAttribute(C, "");
+ } catch {
+ }
+ }, Le = function(C) {
+ let j = null, le = null;
+ if (pn)
+ C = " " + C;
+ else {
+ const E = Bl(C, /^[\r\n\t ]+/);
+ le = E && E[0];
+ }
+ _0 === "application/xhtml+xml" && u0 === qt && (C = '' + C + "");
+ const v = S ? S.createHTML(C) : C;
+ if (u0 === qt)
+ try {
+ j = new P().parseFromString(v, _0);
+ } catch {
+ }
+ if (!j || !j.documentElement) {
+ j = L.createDocument(u0, "template", null);
+ try {
+ j.documentElement.innerHTML = Ne ? M : v;
+ } catch {
+ }
+ }
+ const Oe = j.body || j.documentElement;
+ return C && le && Oe.insertBefore(s.createTextNode(le), Oe.childNodes[0] || null), u0 === qt ? te.call(j, Ot ? "html" : "body")[0] : Ot ? j.documentElement : Oe;
+ }, h = function(C) {
+ return z.call(
+ C.ownerDocument || C,
+ C,
+ // eslint-disable-next-line no-bitwise
+ y.SHOW_ELEMENT | y.SHOW_COMMENT | y.SHOW_TEXT | y.SHOW_PROCESSING_INSTRUCTION | y.SHOW_CDATA_SECTION,
+ null
+ );
+ }, d = function(C) {
+ return C instanceof T && (typeof C.nodeName != "string" || typeof C.textContent != "string" || typeof C.removeChild != "function" || !(C.attributes instanceof D) || typeof C.removeAttribute != "function" || typeof C.setAttribute != "function" || typeof C.namespaceURI != "string" || typeof C.insertBefore != "function" || typeof C.hasChildNodes != "function");
+ }, V = function(C) {
+ return typeof p == "function" && C instanceof p;
+ }, w = function(C, j, le) {
+ ce[C] && ar(ce[C], (v) => {
+ v.call(r, j, le, Yt);
+ });
+ }, A = function(C) {
+ let j = null;
+ if (w("beforeSanitizeElements", C, null), d(C))
+ return Zt(C), !0;
+ const le = Ge(C.nodeName);
+ if (w("uponSanitizeElement", C, {
+ tagName: le,
+ allowedTags: _e
+ }), C.hasChildNodes() && !V(C.firstElementChild) && _t(/<[/\w]/g, C.innerHTML) && _t(/<[/\w]/g, C.textContent) || C.nodeType === 7)
+ return Zt(C), !0;
+ if (!_e[le] || tt[le]) {
+ if (!tt[le] && re(le) && (he.tagNameCheck instanceof RegExp && _t(he.tagNameCheck, le) || he.tagNameCheck instanceof Function && he.tagNameCheck(le)))
+ return !1;
+ if (J0 && !jt[le]) {
+ const v = N(C) || C.parentNode, Oe = R(C) || C.childNodes;
+ if (Oe && v) {
+ const E = Oe.length;
+ for (let rt = E - 1; rt >= 0; --rt)
+ v.insertBefore(ee(Oe[rt], !0), Z(C));
+ }
+ }
+ return Zt(C), !0;
+ }
+ return C instanceof g && !Mr(C) || (le === "noscript" || le === "noembed" || le === "noframes") && _t(/<\/no(script|embed|frames)/i, C.innerHTML) ? (Zt(C), !0) : (pt && C.nodeType === 3 && (j = C.textContent, ar([oe, Ce, ke], (v) => {
+ j = Sn(j, v, " ");
+ }), C.textContent !== j && (An(r.removed, {
+ element: C.cloneNode()
+ }), C.textContent = j)), w("afterSanitizeElements", C, null), !1);
+ }, Re = function(C, j, le) {
+ if (w0 && (j === "id" || j === "name") && (le in s || le in Tr))
+ return !1;
+ if (!(a0 && !it[j] && _t(Pe, j))) {
+ if (!(l0 && _t(et, j))) {
+ if (!X[j] || it[j]) {
+ if (
+ // First condition does a very basic check if a) it's basically a valid custom element tagname AND
+ // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
+ // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck
+ !(re(C) && (he.tagNameCheck instanceof RegExp && _t(he.tagNameCheck, C) || he.tagNameCheck instanceof Function && he.tagNameCheck(C)) && (he.attributeNameCheck instanceof RegExp && _t(he.attributeNameCheck, j) || he.attributeNameCheck instanceof Function && he.attributeNameCheck(j)) || // Alternative, second condition checks if it's an `is`-attribute, AND
+ // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
+ j === "is" && he.allowCustomizedBuiltInElements && (he.tagNameCheck instanceof RegExp && _t(he.tagNameCheck, le) || he.tagNameCheck instanceof Function && he.tagNameCheck(le)))
+ )
+ return !1;
+ } else if (!$0[j]) {
+ if (!_t(J, Sn(le, mt, ""))) {
+ if (!((j === "src" || j === "xlink:href" || j === "href") && C !== "script" && T4(le, "data:") === 0 && In[C])) {
+ if (!(I0 && !_t(vt, Sn(le, mt, "")))) {
+ if (le)
+ return !1;
+ }
+ }
+ }
+ }
+ }
+ }
+ return !0;
+ }, re = function(C) {
+ return C !== "annotation-xml" && Bl(C, Be);
+ }, nt = function(C) {
+ w("beforeSanitizeAttributes", C, null);
+ const {
+ attributes: j
+ } = C;
+ if (!j)
+ return;
+ const le = {
+ attrName: "",
+ attrValue: "",
+ keepAttr: !0,
+ allowedAttributes: X
+ };
+ let v = j.length;
+ for (; v--; ) {
+ const Oe = j[v], {
+ name: E,
+ namespaceURI: rt,
+ value: Kt
+ } = Oe, D0 = Ge(E);
+ let Qe = E === "value" ? Kt : M4(Kt);
+ if (le.attrName = D0, le.attrValue = Qe, le.keepAttr = !0, le.forceKeepAttr = void 0, w("uponSanitizeAttribute", C, le), Qe = le.attrValue, le.forceKeepAttr || (k0(E, C), !le.keepAttr))
+ continue;
+ if (!g0 && _t(/\/>/i, Qe)) {
+ k0(E, C);
+ continue;
+ }
+ pt && ar([oe, Ce, ke], (tn) => {
+ Qe = Sn(Qe, tn, " ");
+ });
+ const fe = Ge(C.nodeName);
+ if (Re(fe, D0, Qe)) {
+ if (gt && (D0 === "id" || D0 === "name") && (k0(E, C), Qe = Q0 + Qe), S && typeof U == "object" && typeof U.getAttributeType == "function" && !rt)
+ switch (U.getAttributeType(fe, D0)) {
+ case "TrustedHTML": {
+ Qe = S.createHTML(Qe);
+ break;
+ }
+ case "TrustedScriptURL": {
+ Qe = S.createScriptURL(Qe);
+ break;
+ }
+ }
+ try {
+ rt ? C.setAttributeNS(rt, E, Qe) : C.setAttribute(E, Qe), zl(r.removed);
+ } catch {
+ }
+ }
+ }
+ w("afterSanitizeAttributes", C, null);
+ }, x0 = function G(C) {
+ let j = null;
+ const le = h(C);
+ for (w("beforeSanitizeShadowDOM", C, null); j = le.nextNode(); )
+ w("uponSanitizeShadowNode", j, null), !A(j) && (j.content instanceof u && G(j.content), nt(j));
+ w("afterSanitizeShadowDOM", C, null);
+ };
+ return r.sanitize = function(G) {
+ let C = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, j = null, le = null, v = null, Oe = null;
+ if (Ne = !G, Ne && (G = ""), typeof G != "string" && !V(G))
+ if (typeof G.toString == "function") {
+ if (G = G.toString(), typeof G != "string")
+ throw Fn("dirty is not a string, aborting");
+ } else
+ throw Fn("toString is not a function");
+ if (!r.isSupported)
+ return G;
+ if (o0 || st(C), r.removed = [], typeof G == "string" && (O0 = !1), O0) {
+ if (G.nodeName) {
+ const Kt = Ge(G.nodeName);
+ if (!_e[Kt] || tt[Kt])
+ throw Fn("root node is forbidden and cannot be sanitized in-place");
+ }
+ } else if (G instanceof p)
+ j = Le(""), le = j.ownerDocument.importNode(G, !0), le.nodeType === 1 && le.nodeName === "BODY" || le.nodeName === "HTML" ? j = le : j.appendChild(le);
+ else {
+ if (!b0 && !pt && !Ot && // eslint-disable-next-line unicorn/prefer-includes
+ G.indexOf("<") === -1)
+ return S && K0 ? S.createHTML(G) : G;
+ if (j = Le(G), !j)
+ return b0 ? null : K0 ? M : "";
+ }
+ j && pn && Zt(j.firstChild);
+ const E = h(O0 ? G : j);
+ for (; v = E.nextNode(); )
+ A(v) || (v.content instanceof u && x0(v.content), nt(v));
+ if (O0)
+ return G;
+ if (b0) {
+ if (L0)
+ for (Oe = H.call(j.ownerDocument); j.firstChild; )
+ Oe.appendChild(j.firstChild);
+ else
+ Oe = j;
+ return (X.shadowroot || X.shadowrootmode) && (Oe = Q.call(i, Oe, !0)), Oe;
+ }
+ let rt = Ot ? j.outerHTML : j.innerHTML;
+ return Ot && _e["!doctype"] && j.ownerDocument && j.ownerDocument.doctype && j.ownerDocument.doctype.name && _t(po, j.ownerDocument.doctype.name) && (rt = "
+` + rt), pt && ar([oe, Ce, ke], (Kt) => {
+ rt = Sn(rt, Kt, " ");
+ }), S && K0 ? S.createHTML(rt) : rt;
+ }, r.setConfig = function() {
+ let G = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
+ st(G), o0 = !0;
+ }, r.clearConfig = function() {
+ Yt = null, o0 = !1;
+ }, r.isValidAttribute = function(G, C, j) {
+ Yt || st({});
+ const le = Ge(G), v = Ge(C);
+ return Re(le, v, j);
+ }, r.addHook = function(G, C) {
+ typeof C == "function" && (ce[G] = ce[G] || [], An(ce[G], C));
+ }, r.removeHook = function(G) {
+ if (ce[G])
+ return zl(ce[G]);
+ }, r.removeHooks = function(G) {
+ ce[G] && (ce[G] = []);
+ }, r.removeAllHooks = function() {
+ ce = {};
+ }, r;
+}
+var ql = go(), yr = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
+function bo(a) {
+ return a && a.__esModule && Object.prototype.hasOwnProperty.call(a, "default") ? a.default : a;
+}
+var wo = { exports: {} }, As = { exports: {} }, Pl;
+function j4() {
+ return Pl || (Pl = 1, function(a, r) {
+ (function(i, o) {
+ a.exports = o();
+ })(typeof self < "u" ? self : yr, function() {
+ return (
+ /******/
+ function() {
+ var s = {};
+ (function() {
+ s.d = function(t, e) {
+ for (var n in e)
+ s.o(e, n) && !s.o(t, n) && Object.defineProperty(t, n, { enumerable: !0, get: e[n] });
+ };
+ })(), function() {
+ s.o = function(t, e) {
+ return Object.prototype.hasOwnProperty.call(t, e);
+ };
+ }();
+ var i = {};
+ s.d(i, {
+ default: function() {
+ return (
+ /* binding */
+ $u
+ );
+ }
+ });
+ class o {
+ // Error start position based on passed-in Token or ParseNode.
+ // Length of affected text based on passed-in Token or ParseNode.
+ // The underlying error message without any context added.
+ constructor(e, n) {
+ this.name = void 0, this.position = void 0, this.length = void 0, this.rawMessage = void 0;
+ let l = "KaTeX parse error: " + e, c, m;
+ const b = n && n.loc;
+ if (b && b.start <= b.end) {
+ const x = b.lexer.input;
+ c = b.start, m = b.end, c === x.length ? l += " at end of input: " : l += " at position " + (c + 1) + ": ";
+ const F = x.slice(c, m).replace(/[^]/g, "$&̲");
+ let B;
+ c > 15 ? B = "…" + x.slice(c - 15, c) : B = x.slice(0, c);
+ let I;
+ m + 15 < x.length ? I = x.slice(m, m + 15) + "…" : I = x.slice(m), l += B + F + I;
+ }
+ const _ = new Error(l);
+ return _.name = "ParseError", _.__proto__ = o.prototype, _.position = c, c != null && m != null && (_.length = m - c), _.rawMessage = e, _;
+ }
+ }
+ o.prototype.__proto__ = Error.prototype;
+ var u = o;
+ const f = function(t, e) {
+ return t.indexOf(e) !== -1;
+ }, p = function(t, e) {
+ return t === void 0 ? e : t;
+ }, g = /([A-Z])/g, y = function(t) {
+ return t.replace(g, "-$1").toLowerCase();
+ }, D = {
+ "&": "&",
+ ">": ">",
+ "<": "<",
+ '"': """,
+ "'": "'"
+ }, T = /[&><"']/g;
+ function P(t) {
+ return String(t).replace(T, (e) => D[e]);
+ }
+ const U = function(t) {
+ return t.type === "ordgroup" || t.type === "color" ? t.body.length === 1 ? U(t.body[0]) : t : t.type === "font" ? U(t.body) : t;
+ }, K = function(t) {
+ const e = U(t);
+ return e.type === "mathord" || e.type === "textord" || e.type === "atom";
+ }, ee = function(t) {
+ if (!t)
+ throw new Error("Expected non-null, but got " + String(t));
+ return t;
+ };
+ var R = {
+ contains: f,
+ deflt: p,
+ escape: P,
+ hyphenate: y,
+ getBaseElem: U,
+ isCharacterBox: K,
+ protocolFromUrl: function(t) {
+ const e = /^[\x00-\x20]*([^\\/#?]*?)(:|*58|*3a|&colon)/i.exec(t);
+ return e ? e[2] !== ":" || !/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(e[1]) ? null : e[1].toLowerCase() : "_relative";
+ }
+ };
+ const N = {
+ displayMode: {
+ type: "boolean",
+ description: "Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",
+ cli: "-d, --display-mode"
+ },
+ output: {
+ type: {
+ enum: ["htmlAndMathml", "html", "mathml"]
+ },
+ description: "Determines the markup language of the output.",
+ cli: "-F, --format "
+ },
+ leqno: {
+ type: "boolean",
+ description: "Render display math in leqno style (left-justified tags)."
+ },
+ fleqn: {
+ type: "boolean",
+ description: "Render display math flush left."
+ },
+ throwOnError: {
+ type: "boolean",
+ default: !0,
+ cli: "-t, --no-throw-on-error",
+ cliDescription: "Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."
+ },
+ errorColor: {
+ type: "string",
+ default: "#cc0000",
+ cli: "-c, --error-color ",
+ cliDescription: "A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",
+ cliProcessor: (t) => "#" + t
+ },
+ macros: {
+ type: "object",
+ cli: "-m, --macro ",
+ cliDescription: "Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",
+ cliDefault: [],
+ cliProcessor: (t, e) => (e.push(t), e)
+ },
+ minRuleThickness: {
+ type: "number",
+ description: "Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",
+ processor: (t) => Math.max(0, t),
+ cli: "--min-rule-thickness ",
+ cliProcessor: parseFloat
+ },
+ colorIsTextColor: {
+ type: "boolean",
+ description: "Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",
+ cli: "-b, --color-is-text-color"
+ },
+ strict: {
+ type: [{
+ enum: ["warn", "ignore", "error"]
+ }, "boolean", "function"],
+ description: "Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",
+ cli: "-S, --strict",
+ cliDefault: !1
+ },
+ trust: {
+ type: ["boolean", "function"],
+ description: "Trust the input, enabling all HTML features such as \\url.",
+ cli: "-T, --trust"
+ },
+ maxSize: {
+ type: "number",
+ default: 1 / 0,
+ description: "If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",
+ processor: (t) => Math.max(0, t),
+ cli: "-s, --max-size ",
+ cliProcessor: parseInt
+ },
+ maxExpand: {
+ type: "number",
+ default: 1e3,
+ description: "Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",
+ processor: (t) => Math.max(0, t),
+ cli: "-e, --max-expand ",
+ cliProcessor: (t) => t === "Infinity" ? 1 / 0 : parseInt(t)
+ },
+ globalGroup: {
+ type: "boolean",
+ cli: !1
+ }
+ };
+ function S(t) {
+ if (t.default)
+ return t.default;
+ const e = t.type, n = Array.isArray(e) ? e[0] : e;
+ if (typeof n != "string")
+ return n.enum[0];
+ switch (n) {
+ case "boolean":
+ return !1;
+ case "string":
+ return "";
+ case "number":
+ return 0;
+ case "object":
+ return {};
+ }
+ }
+ class M {
+ constructor(e) {
+ this.displayMode = void 0, this.output = void 0, this.leqno = void 0, this.fleqn = void 0, this.throwOnError = void 0, this.errorColor = void 0, this.macros = void 0, this.minRuleThickness = void 0, this.colorIsTextColor = void 0, this.strict = void 0, this.trust = void 0, this.maxSize = void 0, this.maxExpand = void 0, this.globalGroup = void 0, e = e || {};
+ for (const n in N)
+ if (N.hasOwnProperty(n)) {
+ const l = N[n];
+ this[n] = e[n] !== void 0 ? l.processor ? l.processor(e[n]) : e[n] : S(l);
+ }
+ }
+ /**
+ * Report nonstrict (non-LaTeX-compatible) input.
+ * Can safely not be called if `this.strict` is false in JavaScript.
+ */
+ reportNonstrict(e, n, l) {
+ let c = this.strict;
+ if (typeof c == "function" && (c = c(e, n, l)), !(!c || c === "ignore")) {
+ if (c === !0 || c === "error")
+ throw new u("LaTeX-incompatible input and strict mode is set to 'error': " + (n + " [" + e + "]"), l);
+ c === "warn" ? typeof console < "u" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (n + " [" + e + "]")) : typeof console < "u" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + c + "': " + n + " [" + e + "]"));
+ }
+ }
+ /**
+ * Check whether to apply strict (LaTeX-adhering) behavior for unusual
+ * input (like `\\`). Unlike `nonstrict`, will not throw an error;
+ * instead, "error" translates to a return value of `true`, while "ignore"
+ * translates to a return value of `false`. May still print a warning:
+ * "warn" prints a warning and returns `false`.
+ * This is for the second category of `errorCode`s listed in the README.
+ */
+ useStrictBehavior(e, n, l) {
+ let c = this.strict;
+ if (typeof c == "function")
+ try {
+ c = c(e, n, l);
+ } catch {
+ c = "error";
+ }
+ return !c || c === "ignore" ? !1 : c === !0 || c === "error" ? !0 : c === "warn" ? (typeof console < "u" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (n + " [" + e + "]")), !1) : (typeof console < "u" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + c + "': " + n + " [" + e + "]")), !1);
+ }
+ /**
+ * Check whether to test potentially dangerous input, and return
+ * `true` (trusted) or `false` (untrusted). The sole argument `context`
+ * should be an object with `command` field specifying the relevant LaTeX
+ * command (as a string starting with `\`), and any other arguments, etc.
+ * If `context` has a `url` field, a `protocol` field will automatically
+ * get added by this function (changing the specified object).
+ */
+ isTrusted(e) {
+ if (e.url && !e.protocol) {
+ const l = R.protocolFromUrl(e.url);
+ if (l == null)
+ return !1;
+ e.protocol = l;
+ }
+ return !!(typeof this.trust == "function" ? this.trust(e) : this.trust);
+ }
+ }
+ class L {
+ constructor(e, n, l) {
+ this.id = void 0, this.size = void 0, this.cramped = void 0, this.id = e, this.size = n, this.cramped = l;
+ }
+ /**
+ * Get the style of a superscript given a base in the current style.
+ */
+ sup() {
+ return Pe[et[this.id]];
+ }
+ /**
+ * Get the style of a subscript given a base in the current style.
+ */
+ sub() {
+ return Pe[vt[this.id]];
+ }
+ /**
+ * Get the style of a fraction numerator given the fraction in the current
+ * style.
+ */
+ fracNum() {
+ return Pe[mt[this.id]];
+ }
+ /**
+ * Get the style of a fraction denominator given the fraction in the current
+ * style.
+ */
+ fracDen() {
+ return Pe[Be[this.id]];
+ }
+ /**
+ * Get the cramped version of a style (in particular, cramping a cramped style
+ * doesn't change the style).
+ */
+ cramp() {
+ return Pe[J[this.id]];
+ }
+ /**
+ * Get a text or display version of this style.
+ */
+ text() {
+ return Pe[_e[this.id]];
+ }
+ /**
+ * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle)
+ */
+ isTight() {
+ return this.size >= 2;
+ }
+ }
+ const z = 0, H = 1, te = 2, Q = 3, ce = 4, oe = 5, Ce = 6, ke = 7, Pe = [new L(z, 0, !1), new L(H, 0, !0), new L(te, 1, !1), new L(Q, 1, !0), new L(ce, 2, !1), new L(oe, 2, !0), new L(Ce, 3, !1), new L(ke, 3, !0)], et = [ce, oe, ce, oe, Ce, ke, Ce, ke], vt = [oe, oe, oe, oe, ke, ke, ke, ke], mt = [te, Q, ce, oe, Ce, ke, Ce, ke], Be = [Q, Q, oe, oe, ke, ke, ke, ke], J = [H, H, Q, Q, oe, oe, ke, ke], _e = [z, H, te, Q, te, Q, te, Q];
+ var ae = {
+ DISPLAY: Pe[z],
+ TEXT: Pe[te],
+ SCRIPT: Pe[ce],
+ SCRIPTSCRIPT: Pe[Ce]
+ };
+ const X = [{
+ // Latin characters beyond the Latin-1 characters we have metrics for.
+ // Needed for Czech, Hungarian and Turkish text, for example.
+ name: "latin",
+ blocks: [
+ [256, 591],
+ // Latin Extended-A and Latin Extended-B
+ [768, 879]
+ // Combining Diacritical marks
+ ]
+ }, {
+ // The Cyrillic script used by Russian and related languages.
+ // A Cyrillic subset used to be supported as explicitly defined
+ // symbols in symbols.js
+ name: "cyrillic",
+ blocks: [[1024, 1279]]
+ }, {
+ // Armenian
+ name: "armenian",
+ blocks: [[1328, 1423]]
+ }, {
+ // The Brahmic scripts of South and Southeast Asia
+ // Devanagari (0900–097F)
+ // Bengali (0980–09FF)
+ // Gurmukhi (0A00–0A7F)
+ // Gujarati (0A80–0AFF)
+ // Oriya (0B00–0B7F)
+ // Tamil (0B80–0BFF)
+ // Telugu (0C00–0C7F)
+ // Kannada (0C80–0CFF)
+ // Malayalam (0D00–0D7F)
+ // Sinhala (0D80–0DFF)
+ // Thai (0E00–0E7F)
+ // Lao (0E80–0EFF)
+ // Tibetan (0F00–0FFF)
+ // Myanmar (1000–109F)
+ name: "brahmic",
+ blocks: [[2304, 4255]]
+ }, {
+ name: "georgian",
+ blocks: [[4256, 4351]]
+ }, {
+ // Chinese and Japanese.
+ // The "k" in cjk is for Korean, but we've separated Korean out
+ name: "cjk",
+ blocks: [
+ [12288, 12543],
+ // CJK symbols and punctuation, Hiragana, Katakana
+ [19968, 40879],
+ // CJK ideograms
+ [65280, 65376]
+ // Fullwidth punctuation
+ // TODO: add halfwidth Katakana and Romanji glyphs
+ ]
+ }, {
+ // Korean
+ name: "hangul",
+ blocks: [[44032, 55215]]
+ }];
+ function ie(t) {
+ for (let e = 0; e < X.length; e++) {
+ const n = X[e];
+ for (let l = 0; l < n.blocks.length; l++) {
+ const c = n.blocks[l];
+ if (t >= c[0] && t <= c[1])
+ return n.name;
+ }
+ }
+ return null;
+ }
+ const he = [];
+ X.forEach((t) => t.blocks.forEach((e) => he.push(...e)));
+ function tt(t) {
+ for (let e = 0; e < he.length; e += 2)
+ if (t >= he[e] && t <= he[e + 1])
+ return !0;
+ return !1;
+ }
+ const it = 80, l0 = function(t, e) {
+ return "M95," + (622 + t + e) + `
+c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
+c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
+c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
+s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
+c69,-144,104.5,-217.7,106.5,-221
+l` + t / 2.075 + " -" + t + `
+c5.3,-9.3,12,-14,20,-14
+H400000v` + (40 + t) + `H845.2724
+s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
+c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
+M` + (834 + t) + " " + e + "h400000v" + (40 + t) + "h-400000z";
+ }, a0 = function(t, e) {
+ return "M263," + (601 + t + e) + `c0.7,0,18,39.7,52,119
+c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120
+c340,-704.7,510.7,-1060.3,512,-1067
+l` + t / 2.084 + " -" + t + `
+c4.7,-7.3,11,-11,19,-11
+H40000v` + (40 + t) + `H1012.3
+s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232
+c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1
+s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26
+c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z
+M` + (1001 + t) + " " + e + "h400000v" + (40 + t) + "h-400000z";
+ }, I0 = function(t, e) {
+ return "M983 " + (10 + t + e) + `
+l` + t / 3.13 + " -" + t + `
+c4,-6.7,10,-10,18,-10 H400000v` + (40 + t) + `
+H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7
+s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744
+c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30
+c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722
+c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5
+c53.7,-170.3,84.5,-266.8,92.5,-289.5z
+M` + (1001 + t) + " " + e + "h400000v" + (40 + t) + "h-400000z";
+ }, g0 = function(t, e) {
+ return "M424," + (2398 + t + e) + `
+c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514
+c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20
+s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121
+s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081
+l` + t / 4.223 + " -" + t + `c4,-6.7,10,-10,18,-10 H400000
+v` + (40 + t) + `H1014.6
+s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185
+c-2,6,-10,9,-24,9
+c-8,0,-12,-0.7,-12,-2z M` + (1001 + t) + " " + e + `
+h400000v` + (40 + t) + "h-400000z";
+ }, pt = function(t, e) {
+ return "M473," + (2713 + t + e) + `
+c339.3,-1799.3,509.3,-2700,510,-2702 l` + t / 5.298 + " -" + t + `
+c3.3,-7.3,9.3,-11,18,-11 H400000v` + (40 + t) + `H1017.7
+s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9
+c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200
+c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26
+s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,
+606zM` + (1001 + t) + " " + e + "h400000v" + (40 + t) + "H1017.7z";
+ }, Ot = function(t) {
+ const e = t / 2;
+ return "M400000 " + t + " H0 L" + e + " 0 l65 45 L145 " + (t - 80) + " H400000z";
+ }, o0 = function(t, e, n) {
+ const l = n - 54 - e - t;
+ return "M702 " + (t + e) + "H400000" + (40 + t) + `
+H742v` + l + `l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1
+h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170
+c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667
+219 661 l218 661zM702 ` + e + "H400000v" + (40 + t) + "H742z";
+ }, pn = function(t, e, n) {
+ e = 1e3 * e;
+ let l = "";
+ switch (t) {
+ case "sqrtMain":
+ l = l0(e, it);
+ break;
+ case "sqrtSize1":
+ l = a0(e, it);
+ break;
+ case "sqrtSize2":
+ l = I0(e, it);
+ break;
+ case "sqrtSize3":
+ l = g0(e, it);
+ break;
+ case "sqrtSize4":
+ l = pt(e, it);
+ break;
+ case "sqrtTall":
+ l = o0(e, it, n);
+ }
+ return l;
+ }, b0 = function(t, e) {
+ switch (t) {
+ case "⎜":
+ return "M291 0 H417 V" + e + " H291z M291 0 H417 V" + e + " H291z";
+ case "∣":
+ return "M145 0 H188 V" + e + " H145z M145 0 H188 V" + e + " H145z";
+ case "∥":
+ return "M145 0 H188 V" + e + " H145z M145 0 H188 V" + e + " H145z" + ("M367 0 H410 V" + e + " H367z M367 0 H410 V" + e + " H367z");
+ case "⎟":
+ return "M457 0 H583 V" + e + " H457z M457 0 H583 V" + e + " H457z";
+ case "⎢":
+ return "M319 0 H403 V" + e + " H319z M319 0 H403 V" + e + " H319z";
+ case "⎥":
+ return "M263 0 H347 V" + e + " H263z M263 0 H347 V" + e + " H263z";
+ case "⎪":
+ return "M384 0 H504 V" + e + " H384z M384 0 H504 V" + e + " H384z";
+ case "⏐":
+ return "M312 0 H355 V" + e + " H312z M312 0 H355 V" + e + " H312z";
+ case "‖":
+ return "M257 0 H300 V" + e + " H257z M257 0 H300 V" + e + " H257z" + ("M478 0 H521 V" + e + " H478z M478 0 H521 V" + e + " H478z");
+ default:
+ return "";
+ }
+ }, L0 = {
+ // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main
+ doubleleftarrow: `M262 157
+l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3
+ 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28
+ 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5
+c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5
+ 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87
+-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7
+-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z
+m8 0v40h399730v-40zm0 194v40h399730v-40z`,
+ // doublerightarrow is from glyph U+21D2 in font KaTeX Main
+ doublerightarrow: `M399738 392l
+-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5
+ 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88
+-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68
+-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18
+-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782
+c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3
+-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,
+ // leftarrow is from glyph U+2190 in font KaTeX Main
+ leftarrow: `M400000 241H110l3-3c68.7-52.7 113.7-120
+ 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8
+-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247
+c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208
+ 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3
+ 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202
+ l-3-3h399890zM100 241v40h399900v-40z`,
+ // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular
+ leftbrace: `M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117
+-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7
+ 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,
+ leftbraceunder: `M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13
+ 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688
+ 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7
+-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,
+ // overgroup is from the MnSymbol package (public domain)
+ leftgroup: `M400000 80
+H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0
+ 435 0h399565z`,
+ leftgroupunder: `M400000 262
+H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219
+ 435 219h399565z`,
+ // Harpoons are from glyph U+21BD in font KaTeX Main
+ leftharpoon: `M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3
+-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5
+-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7
+-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,
+ leftharpoonplus: `M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5
+ 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3
+-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7
+-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z
+m0 0v40h400000v-40z`,
+ leftharpoondown: `M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333
+ 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5
+ 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667
+-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,
+ leftharpoondownplus: `M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12
+ 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7
+-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0
+v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,
+ // hook is from glyph U+21A9 in font KaTeX Main
+ lefthook: `M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5
+-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3
+-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21
+ 71.5 23h399859zM103 281v-40h399897v40z`,
+ leftlinesegment: `M40 281 V428 H0 V94 H40 V241 H400000 v40z
+M40 281 V428 H0 V94 H40 V241 H400000 v40z`,
+ leftmapsto: `M40 281 V448H0V74H40V241H400000v40z
+M40 281 V448H0V74H40V241H400000v40z`,
+ // tofrom is from glyph U+21C4 in font KaTeX AMS Regular
+ leftToFrom: `M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23
+-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8
+c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3
+ 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,
+ longequal: `M0 50 h400000 v40H0z m0 194h40000v40H0z
+M0 50 h400000 v40H0z m0 194h40000v40H0z`,
+ midbrace: `M200428 334
+c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14
+-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7
+ 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11
+ 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,
+ midbraceunder: `M199572 214
+c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14
+ 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3
+ 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0
+-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,
+ oiintSize1: `M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6
+-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z
+m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8
+60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,
+ oiintSize2: `M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8
+-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z
+m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2
+c0 110 84 276 504 276s502.4-166 502.4-276z`,
+ oiiintSize1: `M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6
+-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z
+m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0
+85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,
+ oiiintSize2: `M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8
+-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z
+m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1
+c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,
+ rightarrow: `M0 241v40h399891c-47.3 35.3-84 78-110 128
+-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
+ 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
+ 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
+-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
+-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
+ 151.7 139 205zm0 0v40h399900v-40z`,
+ rightbrace: `M400000 542l
+-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5
+s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1
+c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,
+ rightbraceunder: `M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3
+ 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237
+-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,
+ rightgroup: `M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0
+ 3-1 3-3v-38c-76-158-257-219-435-219H0z`,
+ rightgroupunder: `M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18
+ 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,
+ rightharpoon: `M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3
+-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2
+-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58
+ 69.2 92 94.5zm0 0v40h399900v-40z`,
+ rightharpoonplus: `M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11
+-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7
+ 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z
+m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,
+ rightharpoondown: `M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8
+ 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5
+-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95
+-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,
+ rightharpoondownplus: `M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8
+ 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3
+ 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3
+-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z
+m0-194v40h400000v-40zm0 0v40h400000v-40z`,
+ righthook: `M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3
+ 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0
+-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21
+ 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,
+ rightlinesegment: `M399960 241 V94 h40 V428 h-40 V281 H0 v-40z
+M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,
+ rightToFrom: `M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23
+ 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32
+-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142
+-167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,
+ // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular
+ twoheadleftarrow: `M0 167c68 40
+ 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69
+-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3
+-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19
+-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101
+ 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,
+ twoheadrightarrow: `M400000 167
+c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3
+ 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42
+ 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333
+-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70
+ 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,
+ // tilde1 is a modified version of a glyph from the MnSymbol package
+ tilde1: `M200 55.538c-77 0-168 73.953-177 73.953-3 0-7
+-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0
+ 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0
+ 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128
+-68.267.847-113-73.952-191-73.952z`,
+ // ditto tilde2, tilde3, & tilde4
+ tilde2: `M344 55.266c-142 0-300.638 81.316-311.5 86.418
+-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9
+ 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114
+c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751
+ 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,
+ tilde3: `M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457
+-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0
+ 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697
+ 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696
+ -338 0-409-156.573-744-156.573z`,
+ tilde4: `M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345
+-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409
+ 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9
+ 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409
+ -175.236-744-175.236z`,
+ // vec is from glyph U+20D7 in font KaTeX Main
+ vec: `M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
+3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
+10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
+-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
+-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
+H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
+c-16-25.333-24-45-24-59z`,
+ // widehat1 is a modified version of a glyph from the MnSymbol package
+ widehat1: `M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
+c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,
+ // ditto widehat2, widehat3, & widehat4
+ widehat2: `M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10
+-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,
+ widehat3: `M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10
+-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,
+ widehat4: `M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10
+-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,
+ // widecheck paths are all inverted versions of widehat
+ widecheck1: `M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,
+-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,
+ widecheck2: `M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
+-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,
+ widecheck3: `M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
+-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,
+ widecheck4: `M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
+-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,
+ // The next ten paths support reaction arrows from the mhchem package.
+ // Arrows for \ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX
+ // baraboveleftarrow is mostly from glyph U+2190 in font KaTeX Main
+ baraboveleftarrow: `M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202
+c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5
+c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130
+s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47
+121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6
+s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11
+c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z
+M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,
+ // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main
+ rightarrowabovebar: `M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32
+-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0
+13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39
+-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5
+-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
+-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
+151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,
+ // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end.
+ // Ref from mhchem.sty: \rlap{\raisebox{-.22ex}{$\kern0.5em
+ baraboveshortleftharpoon: `M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11
+c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17
+c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21
+c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40
+c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z
+M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,
+ rightharpoonaboveshortbar: `M0,241 l0,40c399126,0,399993,0,399993,0
+c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,
+-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6
+c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z
+M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,
+ shortbaraboveleftharpoon: `M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11
+c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,
+1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,
+-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z
+M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,
+ shortrightharpoonabovebar: `M53,241l0,40c398570,0,399437,0,399437,0
+c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,
+-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6
+c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z
+M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`
+ }, K0 = function(t, e) {
+ switch (t) {
+ case "lbrack":
+ return "M403 1759 V84 H666 V0 H319 V1759 v" + e + ` v1759 h347 v-84
+H403z M403 1759 V0 H319 V1759 v` + e + " v1759 h84z";
+ case "rbrack":
+ return "M347 1759 V0 H0 V84 H263 V1759 v" + e + ` v1759 H0 v84 H347z
+M347 1759 V0 H263 V1759 v` + e + " v1759 h84z";
+ case "vert":
+ return "M145 15 v585 v" + e + ` v585 c2.667,10,9.667,15,21,15
+c10,0,16.667,-5,20,-15 v-585 v` + -e + ` v-585 c-2.667,-10,-9.667,-15,-21,-15
+c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v` + e + " v585 h43z";
+ case "doublevert":
+ return "M145 15 v585 v" + e + ` v585 c2.667,10,9.667,15,21,15
+c10,0,16.667,-5,20,-15 v-585 v` + -e + ` v-585 c-2.667,-10,-9.667,-15,-21,-15
+c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v` + e + ` v585 h43z
+M367 15 v585 v` + e + ` v585 c2.667,10,9.667,15,21,15
+c10,0,16.667,-5,20,-15 v-585 v` + -e + ` v-585 c-2.667,-10,-9.667,-15,-21,-15
+c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v` + e + " v585 h43z";
+ case "lfloor":
+ return "M319 602 V0 H403 V602 v" + e + ` v1715 h263 v84 H319z
+MM319 602 V0 H403 V602 v` + e + " v1715 H319z";
+ case "rfloor":
+ return "M319 602 V0 H403 V602 v" + e + ` v1799 H0 v-84 H319z
+MM319 602 V0 H403 V602 v` + e + " v1715 H319z";
+ case "lceil":
+ return "M403 1759 V84 H666 V0 H319 V1759 v" + e + ` v602 h84z
+M403 1759 V0 H319 V1759 v` + e + " v602 h84z";
+ case "rceil":
+ return "M347 1759 V0 H0 V84 H263 V1759 v" + e + ` v602 h84z
+M347 1759 V0 h-84 V1759 v` + e + " v602 h84z";
+ case "lparen":
+ return `M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1
+c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,
+-36,557 l0,` + (e + 84) + `c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,
+949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9
+c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,
+-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189
+l0,-` + (e + 92) + `c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,
+-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;
+ case "rparen":
+ return `M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,
+63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5
+c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,` + (e + 9) + `
+c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664
+c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11
+c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17
+c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558
+l0,-` + (e + 144) + `c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,
+-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;
+ default:
+ throw new Error("Unknown stretchy delimiter.");
+ }
+ };
+ class w0 {
+ // HtmlDomNode
+ // Never used; needed for satisfying interface.
+ constructor(e) {
+ this.children = void 0, this.classes = void 0, this.height = void 0, this.depth = void 0, this.maxFontSize = void 0, this.style = void 0, this.children = e, this.classes = [], this.height = 0, this.depth = 0, this.maxFontSize = 0, this.style = {};
+ }
+ hasClass(e) {
+ return R.contains(this.classes, e);
+ }
+ /** Convert the fragment into a node. */
+ toNode() {
+ const e = document.createDocumentFragment();
+ for (let n = 0; n < this.children.length; n++)
+ e.appendChild(this.children[n].toNode());
+ return e;
+ }
+ /** Convert the fragment into HTML markup. */
+ toMarkup() {
+ let e = "";
+ for (let n = 0; n < this.children.length; n++)
+ e += this.children[n].toMarkup();
+ return e;
+ }
+ /**
+ * Converts the math node into a string, similar to innerText. Applies to
+ * MathDomNode's only.
+ */
+ toText() {
+ const e = (n) => n.toText();
+ return this.children.map(e).join("");
+ }
+ }
+ var gt = {
+ "AMS-Regular": {
+ 32: [0, 0, 0, 0, 0.25],
+ 65: [0, 0.68889, 0, 0, 0.72222],
+ 66: [0, 0.68889, 0, 0, 0.66667],
+ 67: [0, 0.68889, 0, 0, 0.72222],
+ 68: [0, 0.68889, 0, 0, 0.72222],
+ 69: [0, 0.68889, 0, 0, 0.66667],
+ 70: [0, 0.68889, 0, 0, 0.61111],
+ 71: [0, 0.68889, 0, 0, 0.77778],
+ 72: [0, 0.68889, 0, 0, 0.77778],
+ 73: [0, 0.68889, 0, 0, 0.38889],
+ 74: [0.16667, 0.68889, 0, 0, 0.5],
+ 75: [0, 0.68889, 0, 0, 0.77778],
+ 76: [0, 0.68889, 0, 0, 0.66667],
+ 77: [0, 0.68889, 0, 0, 0.94445],
+ 78: [0, 0.68889, 0, 0, 0.72222],
+ 79: [0.16667, 0.68889, 0, 0, 0.77778],
+ 80: [0, 0.68889, 0, 0, 0.61111],
+ 81: [0.16667, 0.68889, 0, 0, 0.77778],
+ 82: [0, 0.68889, 0, 0, 0.72222],
+ 83: [0, 0.68889, 0, 0, 0.55556],
+ 84: [0, 0.68889, 0, 0, 0.66667],
+ 85: [0, 0.68889, 0, 0, 0.72222],
+ 86: [0, 0.68889, 0, 0, 0.72222],
+ 87: [0, 0.68889, 0, 0, 1],
+ 88: [0, 0.68889, 0, 0, 0.72222],
+ 89: [0, 0.68889, 0, 0, 0.72222],
+ 90: [0, 0.68889, 0, 0, 0.66667],
+ 107: [0, 0.68889, 0, 0, 0.55556],
+ 160: [0, 0, 0, 0, 0.25],
+ 165: [0, 0.675, 0.025, 0, 0.75],
+ 174: [0.15559, 0.69224, 0, 0, 0.94666],
+ 240: [0, 0.68889, 0, 0, 0.55556],
+ 295: [0, 0.68889, 0, 0, 0.54028],
+ 710: [0, 0.825, 0, 0, 2.33334],
+ 732: [0, 0.9, 0, 0, 2.33334],
+ 770: [0, 0.825, 0, 0, 2.33334],
+ 771: [0, 0.9, 0, 0, 2.33334],
+ 989: [0.08167, 0.58167, 0, 0, 0.77778],
+ 1008: [0, 0.43056, 0.04028, 0, 0.66667],
+ 8245: [0, 0.54986, 0, 0, 0.275],
+ 8463: [0, 0.68889, 0, 0, 0.54028],
+ 8487: [0, 0.68889, 0, 0, 0.72222],
+ 8498: [0, 0.68889, 0, 0, 0.55556],
+ 8502: [0, 0.68889, 0, 0, 0.66667],
+ 8503: [0, 0.68889, 0, 0, 0.44445],
+ 8504: [0, 0.68889, 0, 0, 0.66667],
+ 8513: [0, 0.68889, 0, 0, 0.63889],
+ 8592: [-0.03598, 0.46402, 0, 0, 0.5],
+ 8594: [-0.03598, 0.46402, 0, 0, 0.5],
+ 8602: [-0.13313, 0.36687, 0, 0, 1],
+ 8603: [-0.13313, 0.36687, 0, 0, 1],
+ 8606: [0.01354, 0.52239, 0, 0, 1],
+ 8608: [0.01354, 0.52239, 0, 0, 1],
+ 8610: [0.01354, 0.52239, 0, 0, 1.11111],
+ 8611: [0.01354, 0.52239, 0, 0, 1.11111],
+ 8619: [0, 0.54986, 0, 0, 1],
+ 8620: [0, 0.54986, 0, 0, 1],
+ 8621: [-0.13313, 0.37788, 0, 0, 1.38889],
+ 8622: [-0.13313, 0.36687, 0, 0, 1],
+ 8624: [0, 0.69224, 0, 0, 0.5],
+ 8625: [0, 0.69224, 0, 0, 0.5],
+ 8630: [0, 0.43056, 0, 0, 1],
+ 8631: [0, 0.43056, 0, 0, 1],
+ 8634: [0.08198, 0.58198, 0, 0, 0.77778],
+ 8635: [0.08198, 0.58198, 0, 0, 0.77778],
+ 8638: [0.19444, 0.69224, 0, 0, 0.41667],
+ 8639: [0.19444, 0.69224, 0, 0, 0.41667],
+ 8642: [0.19444, 0.69224, 0, 0, 0.41667],
+ 8643: [0.19444, 0.69224, 0, 0, 0.41667],
+ 8644: [0.1808, 0.675, 0, 0, 1],
+ 8646: [0.1808, 0.675, 0, 0, 1],
+ 8647: [0.1808, 0.675, 0, 0, 1],
+ 8648: [0.19444, 0.69224, 0, 0, 0.83334],
+ 8649: [0.1808, 0.675, 0, 0, 1],
+ 8650: [0.19444, 0.69224, 0, 0, 0.83334],
+ 8651: [0.01354, 0.52239, 0, 0, 1],
+ 8652: [0.01354, 0.52239, 0, 0, 1],
+ 8653: [-0.13313, 0.36687, 0, 0, 1],
+ 8654: [-0.13313, 0.36687, 0, 0, 1],
+ 8655: [-0.13313, 0.36687, 0, 0, 1],
+ 8666: [0.13667, 0.63667, 0, 0, 1],
+ 8667: [0.13667, 0.63667, 0, 0, 1],
+ 8669: [-0.13313, 0.37788, 0, 0, 1],
+ 8672: [-0.064, 0.437, 0, 0, 1.334],
+ 8674: [-0.064, 0.437, 0, 0, 1.334],
+ 8705: [0, 0.825, 0, 0, 0.5],
+ 8708: [0, 0.68889, 0, 0, 0.55556],
+ 8709: [0.08167, 0.58167, 0, 0, 0.77778],
+ 8717: [0, 0.43056, 0, 0, 0.42917],
+ 8722: [-0.03598, 0.46402, 0, 0, 0.5],
+ 8724: [0.08198, 0.69224, 0, 0, 0.77778],
+ 8726: [0.08167, 0.58167, 0, 0, 0.77778],
+ 8733: [0, 0.69224, 0, 0, 0.77778],
+ 8736: [0, 0.69224, 0, 0, 0.72222],
+ 8737: [0, 0.69224, 0, 0, 0.72222],
+ 8738: [0.03517, 0.52239, 0, 0, 0.72222],
+ 8739: [0.08167, 0.58167, 0, 0, 0.22222],
+ 8740: [0.25142, 0.74111, 0, 0, 0.27778],
+ 8741: [0.08167, 0.58167, 0, 0, 0.38889],
+ 8742: [0.25142, 0.74111, 0, 0, 0.5],
+ 8756: [0, 0.69224, 0, 0, 0.66667],
+ 8757: [0, 0.69224, 0, 0, 0.66667],
+ 8764: [-0.13313, 0.36687, 0, 0, 0.77778],
+ 8765: [-0.13313, 0.37788, 0, 0, 0.77778],
+ 8769: [-0.13313, 0.36687, 0, 0, 0.77778],
+ 8770: [-0.03625, 0.46375, 0, 0, 0.77778],
+ 8774: [0.30274, 0.79383, 0, 0, 0.77778],
+ 8776: [-0.01688, 0.48312, 0, 0, 0.77778],
+ 8778: [0.08167, 0.58167, 0, 0, 0.77778],
+ 8782: [0.06062, 0.54986, 0, 0, 0.77778],
+ 8783: [0.06062, 0.54986, 0, 0, 0.77778],
+ 8785: [0.08198, 0.58198, 0, 0, 0.77778],
+ 8786: [0.08198, 0.58198, 0, 0, 0.77778],
+ 8787: [0.08198, 0.58198, 0, 0, 0.77778],
+ 8790: [0, 0.69224, 0, 0, 0.77778],
+ 8791: [0.22958, 0.72958, 0, 0, 0.77778],
+ 8796: [0.08198, 0.91667, 0, 0, 0.77778],
+ 8806: [0.25583, 0.75583, 0, 0, 0.77778],
+ 8807: [0.25583, 0.75583, 0, 0, 0.77778],
+ 8808: [0.25142, 0.75726, 0, 0, 0.77778],
+ 8809: [0.25142, 0.75726, 0, 0, 0.77778],
+ 8812: [0.25583, 0.75583, 0, 0, 0.5],
+ 8814: [0.20576, 0.70576, 0, 0, 0.77778],
+ 8815: [0.20576, 0.70576, 0, 0, 0.77778],
+ 8816: [0.30274, 0.79383, 0, 0, 0.77778],
+ 8817: [0.30274, 0.79383, 0, 0, 0.77778],
+ 8818: [0.22958, 0.72958, 0, 0, 0.77778],
+ 8819: [0.22958, 0.72958, 0, 0, 0.77778],
+ 8822: [0.1808, 0.675, 0, 0, 0.77778],
+ 8823: [0.1808, 0.675, 0, 0, 0.77778],
+ 8828: [0.13667, 0.63667, 0, 0, 0.77778],
+ 8829: [0.13667, 0.63667, 0, 0, 0.77778],
+ 8830: [0.22958, 0.72958, 0, 0, 0.77778],
+ 8831: [0.22958, 0.72958, 0, 0, 0.77778],
+ 8832: [0.20576, 0.70576, 0, 0, 0.77778],
+ 8833: [0.20576, 0.70576, 0, 0, 0.77778],
+ 8840: [0.30274, 0.79383, 0, 0, 0.77778],
+ 8841: [0.30274, 0.79383, 0, 0, 0.77778],
+ 8842: [0.13597, 0.63597, 0, 0, 0.77778],
+ 8843: [0.13597, 0.63597, 0, 0, 0.77778],
+ 8847: [0.03517, 0.54986, 0, 0, 0.77778],
+ 8848: [0.03517, 0.54986, 0, 0, 0.77778],
+ 8858: [0.08198, 0.58198, 0, 0, 0.77778],
+ 8859: [0.08198, 0.58198, 0, 0, 0.77778],
+ 8861: [0.08198, 0.58198, 0, 0, 0.77778],
+ 8862: [0, 0.675, 0, 0, 0.77778],
+ 8863: [0, 0.675, 0, 0, 0.77778],
+ 8864: [0, 0.675, 0, 0, 0.77778],
+ 8865: [0, 0.675, 0, 0, 0.77778],
+ 8872: [0, 0.69224, 0, 0, 0.61111],
+ 8873: [0, 0.69224, 0, 0, 0.72222],
+ 8874: [0, 0.69224, 0, 0, 0.88889],
+ 8876: [0, 0.68889, 0, 0, 0.61111],
+ 8877: [0, 0.68889, 0, 0, 0.61111],
+ 8878: [0, 0.68889, 0, 0, 0.72222],
+ 8879: [0, 0.68889, 0, 0, 0.72222],
+ 8882: [0.03517, 0.54986, 0, 0, 0.77778],
+ 8883: [0.03517, 0.54986, 0, 0, 0.77778],
+ 8884: [0.13667, 0.63667, 0, 0, 0.77778],
+ 8885: [0.13667, 0.63667, 0, 0, 0.77778],
+ 8888: [0, 0.54986, 0, 0, 1.11111],
+ 8890: [0.19444, 0.43056, 0, 0, 0.55556],
+ 8891: [0.19444, 0.69224, 0, 0, 0.61111],
+ 8892: [0.19444, 0.69224, 0, 0, 0.61111],
+ 8901: [0, 0.54986, 0, 0, 0.27778],
+ 8903: [0.08167, 0.58167, 0, 0, 0.77778],
+ 8905: [0.08167, 0.58167, 0, 0, 0.77778],
+ 8906: [0.08167, 0.58167, 0, 0, 0.77778],
+ 8907: [0, 0.69224, 0, 0, 0.77778],
+ 8908: [0, 0.69224, 0, 0, 0.77778],
+ 8909: [-0.03598, 0.46402, 0, 0, 0.77778],
+ 8910: [0, 0.54986, 0, 0, 0.76042],
+ 8911: [0, 0.54986, 0, 0, 0.76042],
+ 8912: [0.03517, 0.54986, 0, 0, 0.77778],
+ 8913: [0.03517, 0.54986, 0, 0, 0.77778],
+ 8914: [0, 0.54986, 0, 0, 0.66667],
+ 8915: [0, 0.54986, 0, 0, 0.66667],
+ 8916: [0, 0.69224, 0, 0, 0.66667],
+ 8918: [0.0391, 0.5391, 0, 0, 0.77778],
+ 8919: [0.0391, 0.5391, 0, 0, 0.77778],
+ 8920: [0.03517, 0.54986, 0, 0, 1.33334],
+ 8921: [0.03517, 0.54986, 0, 0, 1.33334],
+ 8922: [0.38569, 0.88569, 0, 0, 0.77778],
+ 8923: [0.38569, 0.88569, 0, 0, 0.77778],
+ 8926: [0.13667, 0.63667, 0, 0, 0.77778],
+ 8927: [0.13667, 0.63667, 0, 0, 0.77778],
+ 8928: [0.30274, 0.79383, 0, 0, 0.77778],
+ 8929: [0.30274, 0.79383, 0, 0, 0.77778],
+ 8934: [0.23222, 0.74111, 0, 0, 0.77778],
+ 8935: [0.23222, 0.74111, 0, 0, 0.77778],
+ 8936: [0.23222, 0.74111, 0, 0, 0.77778],
+ 8937: [0.23222, 0.74111, 0, 0, 0.77778],
+ 8938: [0.20576, 0.70576, 0, 0, 0.77778],
+ 8939: [0.20576, 0.70576, 0, 0, 0.77778],
+ 8940: [0.30274, 0.79383, 0, 0, 0.77778],
+ 8941: [0.30274, 0.79383, 0, 0, 0.77778],
+ 8994: [0.19444, 0.69224, 0, 0, 0.77778],
+ 8995: [0.19444, 0.69224, 0, 0, 0.77778],
+ 9416: [0.15559, 0.69224, 0, 0, 0.90222],
+ 9484: [0, 0.69224, 0, 0, 0.5],
+ 9488: [0, 0.69224, 0, 0, 0.5],
+ 9492: [0, 0.37788, 0, 0, 0.5],
+ 9496: [0, 0.37788, 0, 0, 0.5],
+ 9585: [0.19444, 0.68889, 0, 0, 0.88889],
+ 9586: [0.19444, 0.74111, 0, 0, 0.88889],
+ 9632: [0, 0.675, 0, 0, 0.77778],
+ 9633: [0, 0.675, 0, 0, 0.77778],
+ 9650: [0, 0.54986, 0, 0, 0.72222],
+ 9651: [0, 0.54986, 0, 0, 0.72222],
+ 9654: [0.03517, 0.54986, 0, 0, 0.77778],
+ 9660: [0, 0.54986, 0, 0, 0.72222],
+ 9661: [0, 0.54986, 0, 0, 0.72222],
+ 9664: [0.03517, 0.54986, 0, 0, 0.77778],
+ 9674: [0.11111, 0.69224, 0, 0, 0.66667],
+ 9733: [0.19444, 0.69224, 0, 0, 0.94445],
+ 10003: [0, 0.69224, 0, 0, 0.83334],
+ 10016: [0, 0.69224, 0, 0, 0.83334],
+ 10731: [0.11111, 0.69224, 0, 0, 0.66667],
+ 10846: [0.19444, 0.75583, 0, 0, 0.61111],
+ 10877: [0.13667, 0.63667, 0, 0, 0.77778],
+ 10878: [0.13667, 0.63667, 0, 0, 0.77778],
+ 10885: [0.25583, 0.75583, 0, 0, 0.77778],
+ 10886: [0.25583, 0.75583, 0, 0, 0.77778],
+ 10887: [0.13597, 0.63597, 0, 0, 0.77778],
+ 10888: [0.13597, 0.63597, 0, 0, 0.77778],
+ 10889: [0.26167, 0.75726, 0, 0, 0.77778],
+ 10890: [0.26167, 0.75726, 0, 0, 0.77778],
+ 10891: [0.48256, 0.98256, 0, 0, 0.77778],
+ 10892: [0.48256, 0.98256, 0, 0, 0.77778],
+ 10901: [0.13667, 0.63667, 0, 0, 0.77778],
+ 10902: [0.13667, 0.63667, 0, 0, 0.77778],
+ 10933: [0.25142, 0.75726, 0, 0, 0.77778],
+ 10934: [0.25142, 0.75726, 0, 0, 0.77778],
+ 10935: [0.26167, 0.75726, 0, 0, 0.77778],
+ 10936: [0.26167, 0.75726, 0, 0, 0.77778],
+ 10937: [0.26167, 0.75726, 0, 0, 0.77778],
+ 10938: [0.26167, 0.75726, 0, 0, 0.77778],
+ 10949: [0.25583, 0.75583, 0, 0, 0.77778],
+ 10950: [0.25583, 0.75583, 0, 0, 0.77778],
+ 10955: [0.28481, 0.79383, 0, 0, 0.77778],
+ 10956: [0.28481, 0.79383, 0, 0, 0.77778],
+ 57350: [0.08167, 0.58167, 0, 0, 0.22222],
+ 57351: [0.08167, 0.58167, 0, 0, 0.38889],
+ 57352: [0.08167, 0.58167, 0, 0, 0.77778],
+ 57353: [0, 0.43056, 0.04028, 0, 0.66667],
+ 57356: [0.25142, 0.75726, 0, 0, 0.77778],
+ 57357: [0.25142, 0.75726, 0, 0, 0.77778],
+ 57358: [0.41951, 0.91951, 0, 0, 0.77778],
+ 57359: [0.30274, 0.79383, 0, 0, 0.77778],
+ 57360: [0.30274, 0.79383, 0, 0, 0.77778],
+ 57361: [0.41951, 0.91951, 0, 0, 0.77778],
+ 57366: [0.25142, 0.75726, 0, 0, 0.77778],
+ 57367: [0.25142, 0.75726, 0, 0, 0.77778],
+ 57368: [0.25142, 0.75726, 0, 0, 0.77778],
+ 57369: [0.25142, 0.75726, 0, 0, 0.77778],
+ 57370: [0.13597, 0.63597, 0, 0, 0.77778],
+ 57371: [0.13597, 0.63597, 0, 0, 0.77778]
+ },
+ "Caligraphic-Regular": {
+ 32: [0, 0, 0, 0, 0.25],
+ 65: [0, 0.68333, 0, 0.19445, 0.79847],
+ 66: [0, 0.68333, 0.03041, 0.13889, 0.65681],
+ 67: [0, 0.68333, 0.05834, 0.13889, 0.52653],
+ 68: [0, 0.68333, 0.02778, 0.08334, 0.77139],
+ 69: [0, 0.68333, 0.08944, 0.11111, 0.52778],
+ 70: [0, 0.68333, 0.09931, 0.11111, 0.71875],
+ 71: [0.09722, 0.68333, 0.0593, 0.11111, 0.59487],
+ 72: [0, 0.68333, 965e-5, 0.11111, 0.84452],
+ 73: [0, 0.68333, 0.07382, 0, 0.54452],
+ 74: [0.09722, 0.68333, 0.18472, 0.16667, 0.67778],
+ 75: [0, 0.68333, 0.01445, 0.05556, 0.76195],
+ 76: [0, 0.68333, 0, 0.13889, 0.68972],
+ 77: [0, 0.68333, 0, 0.13889, 1.2009],
+ 78: [0, 0.68333, 0.14736, 0.08334, 0.82049],
+ 79: [0, 0.68333, 0.02778, 0.11111, 0.79611],
+ 80: [0, 0.68333, 0.08222, 0.08334, 0.69556],
+ 81: [0.09722, 0.68333, 0, 0.11111, 0.81667],
+ 82: [0, 0.68333, 0, 0.08334, 0.8475],
+ 83: [0, 0.68333, 0.075, 0.13889, 0.60556],
+ 84: [0, 0.68333, 0.25417, 0, 0.54464],
+ 85: [0, 0.68333, 0.09931, 0.08334, 0.62583],
+ 86: [0, 0.68333, 0.08222, 0, 0.61278],
+ 87: [0, 0.68333, 0.08222, 0.08334, 0.98778],
+ 88: [0, 0.68333, 0.14643, 0.13889, 0.7133],
+ 89: [0.09722, 0.68333, 0.08222, 0.08334, 0.66834],
+ 90: [0, 0.68333, 0.07944, 0.13889, 0.72473],
+ 160: [0, 0, 0, 0, 0.25]
+ },
+ "Fraktur-Regular": {
+ 32: [0, 0, 0, 0, 0.25],
+ 33: [0, 0.69141, 0, 0, 0.29574],
+ 34: [0, 0.69141, 0, 0, 0.21471],
+ 38: [0, 0.69141, 0, 0, 0.73786],
+ 39: [0, 0.69141, 0, 0, 0.21201],
+ 40: [0.24982, 0.74947, 0, 0, 0.38865],
+ 41: [0.24982, 0.74947, 0, 0, 0.38865],
+ 42: [0, 0.62119, 0, 0, 0.27764],
+ 43: [0.08319, 0.58283, 0, 0, 0.75623],
+ 44: [0, 0.10803, 0, 0, 0.27764],
+ 45: [0.08319, 0.58283, 0, 0, 0.75623],
+ 46: [0, 0.10803, 0, 0, 0.27764],
+ 47: [0.24982, 0.74947, 0, 0, 0.50181],
+ 48: [0, 0.47534, 0, 0, 0.50181],
+ 49: [0, 0.47534, 0, 0, 0.50181],
+ 50: [0, 0.47534, 0, 0, 0.50181],
+ 51: [0.18906, 0.47534, 0, 0, 0.50181],
+ 52: [0.18906, 0.47534, 0, 0, 0.50181],
+ 53: [0.18906, 0.47534, 0, 0, 0.50181],
+ 54: [0, 0.69141, 0, 0, 0.50181],
+ 55: [0.18906, 0.47534, 0, 0, 0.50181],
+ 56: [0, 0.69141, 0, 0, 0.50181],
+ 57: [0.18906, 0.47534, 0, 0, 0.50181],
+ 58: [0, 0.47534, 0, 0, 0.21606],
+ 59: [0.12604, 0.47534, 0, 0, 0.21606],
+ 61: [-0.13099, 0.36866, 0, 0, 0.75623],
+ 63: [0, 0.69141, 0, 0, 0.36245],
+ 65: [0, 0.69141, 0, 0, 0.7176],
+ 66: [0, 0.69141, 0, 0, 0.88397],
+ 67: [0, 0.69141, 0, 0, 0.61254],
+ 68: [0, 0.69141, 0, 0, 0.83158],
+ 69: [0, 0.69141, 0, 0, 0.66278],
+ 70: [0.12604, 0.69141, 0, 0, 0.61119],
+ 71: [0, 0.69141, 0, 0, 0.78539],
+ 72: [0.06302, 0.69141, 0, 0, 0.7203],
+ 73: [0, 0.69141, 0, 0, 0.55448],
+ 74: [0.12604, 0.69141, 0, 0, 0.55231],
+ 75: [0, 0.69141, 0, 0, 0.66845],
+ 76: [0, 0.69141, 0, 0, 0.66602],
+ 77: [0, 0.69141, 0, 0, 1.04953],
+ 78: [0, 0.69141, 0, 0, 0.83212],
+ 79: [0, 0.69141, 0, 0, 0.82699],
+ 80: [0.18906, 0.69141, 0, 0, 0.82753],
+ 81: [0.03781, 0.69141, 0, 0, 0.82699],
+ 82: [0, 0.69141, 0, 0, 0.82807],
+ 83: [0, 0.69141, 0, 0, 0.82861],
+ 84: [0, 0.69141, 0, 0, 0.66899],
+ 85: [0, 0.69141, 0, 0, 0.64576],
+ 86: [0, 0.69141, 0, 0, 0.83131],
+ 87: [0, 0.69141, 0, 0, 1.04602],
+ 88: [0, 0.69141, 0, 0, 0.71922],
+ 89: [0.18906, 0.69141, 0, 0, 0.83293],
+ 90: [0.12604, 0.69141, 0, 0, 0.60201],
+ 91: [0.24982, 0.74947, 0, 0, 0.27764],
+ 93: [0.24982, 0.74947, 0, 0, 0.27764],
+ 94: [0, 0.69141, 0, 0, 0.49965],
+ 97: [0, 0.47534, 0, 0, 0.50046],
+ 98: [0, 0.69141, 0, 0, 0.51315],
+ 99: [0, 0.47534, 0, 0, 0.38946],
+ 100: [0, 0.62119, 0, 0, 0.49857],
+ 101: [0, 0.47534, 0, 0, 0.40053],
+ 102: [0.18906, 0.69141, 0, 0, 0.32626],
+ 103: [0.18906, 0.47534, 0, 0, 0.5037],
+ 104: [0.18906, 0.69141, 0, 0, 0.52126],
+ 105: [0, 0.69141, 0, 0, 0.27899],
+ 106: [0, 0.69141, 0, 0, 0.28088],
+ 107: [0, 0.69141, 0, 0, 0.38946],
+ 108: [0, 0.69141, 0, 0, 0.27953],
+ 109: [0, 0.47534, 0, 0, 0.76676],
+ 110: [0, 0.47534, 0, 0, 0.52666],
+ 111: [0, 0.47534, 0, 0, 0.48885],
+ 112: [0.18906, 0.52396, 0, 0, 0.50046],
+ 113: [0.18906, 0.47534, 0, 0, 0.48912],
+ 114: [0, 0.47534, 0, 0, 0.38919],
+ 115: [0, 0.47534, 0, 0, 0.44266],
+ 116: [0, 0.62119, 0, 0, 0.33301],
+ 117: [0, 0.47534, 0, 0, 0.5172],
+ 118: [0, 0.52396, 0, 0, 0.5118],
+ 119: [0, 0.52396, 0, 0, 0.77351],
+ 120: [0.18906, 0.47534, 0, 0, 0.38865],
+ 121: [0.18906, 0.47534, 0, 0, 0.49884],
+ 122: [0.18906, 0.47534, 0, 0, 0.39054],
+ 160: [0, 0, 0, 0, 0.25],
+ 8216: [0, 0.69141, 0, 0, 0.21471],
+ 8217: [0, 0.69141, 0, 0, 0.21471],
+ 58112: [0, 0.62119, 0, 0, 0.49749],
+ 58113: [0, 0.62119, 0, 0, 0.4983],
+ 58114: [0.18906, 0.69141, 0, 0, 0.33328],
+ 58115: [0.18906, 0.69141, 0, 0, 0.32923],
+ 58116: [0.18906, 0.47534, 0, 0, 0.50343],
+ 58117: [0, 0.69141, 0, 0, 0.33301],
+ 58118: [0, 0.62119, 0, 0, 0.33409],
+ 58119: [0, 0.47534, 0, 0, 0.50073]
+ },
+ "Main-Bold": {
+ 32: [0, 0, 0, 0, 0.25],
+ 33: [0, 0.69444, 0, 0, 0.35],
+ 34: [0, 0.69444, 0, 0, 0.60278],
+ 35: [0.19444, 0.69444, 0, 0, 0.95833],
+ 36: [0.05556, 0.75, 0, 0, 0.575],
+ 37: [0.05556, 0.75, 0, 0, 0.95833],
+ 38: [0, 0.69444, 0, 0, 0.89444],
+ 39: [0, 0.69444, 0, 0, 0.31944],
+ 40: [0.25, 0.75, 0, 0, 0.44722],
+ 41: [0.25, 0.75, 0, 0, 0.44722],
+ 42: [0, 0.75, 0, 0, 0.575],
+ 43: [0.13333, 0.63333, 0, 0, 0.89444],
+ 44: [0.19444, 0.15556, 0, 0, 0.31944],
+ 45: [0, 0.44444, 0, 0, 0.38333],
+ 46: [0, 0.15556, 0, 0, 0.31944],
+ 47: [0.25, 0.75, 0, 0, 0.575],
+ 48: [0, 0.64444, 0, 0, 0.575],
+ 49: [0, 0.64444, 0, 0, 0.575],
+ 50: [0, 0.64444, 0, 0, 0.575],
+ 51: [0, 0.64444, 0, 0, 0.575],
+ 52: [0, 0.64444, 0, 0, 0.575],
+ 53: [0, 0.64444, 0, 0, 0.575],
+ 54: [0, 0.64444, 0, 0, 0.575],
+ 55: [0, 0.64444, 0, 0, 0.575],
+ 56: [0, 0.64444, 0, 0, 0.575],
+ 57: [0, 0.64444, 0, 0, 0.575],
+ 58: [0, 0.44444, 0, 0, 0.31944],
+ 59: [0.19444, 0.44444, 0, 0, 0.31944],
+ 60: [0.08556, 0.58556, 0, 0, 0.89444],
+ 61: [-0.10889, 0.39111, 0, 0, 0.89444],
+ 62: [0.08556, 0.58556, 0, 0, 0.89444],
+ 63: [0, 0.69444, 0, 0, 0.54305],
+ 64: [0, 0.69444, 0, 0, 0.89444],
+ 65: [0, 0.68611, 0, 0, 0.86944],
+ 66: [0, 0.68611, 0, 0, 0.81805],
+ 67: [0, 0.68611, 0, 0, 0.83055],
+ 68: [0, 0.68611, 0, 0, 0.88194],
+ 69: [0, 0.68611, 0, 0, 0.75555],
+ 70: [0, 0.68611, 0, 0, 0.72361],
+ 71: [0, 0.68611, 0, 0, 0.90416],
+ 72: [0, 0.68611, 0, 0, 0.9],
+ 73: [0, 0.68611, 0, 0, 0.43611],
+ 74: [0, 0.68611, 0, 0, 0.59444],
+ 75: [0, 0.68611, 0, 0, 0.90138],
+ 76: [0, 0.68611, 0, 0, 0.69166],
+ 77: [0, 0.68611, 0, 0, 1.09166],
+ 78: [0, 0.68611, 0, 0, 0.9],
+ 79: [0, 0.68611, 0, 0, 0.86388],
+ 80: [0, 0.68611, 0, 0, 0.78611],
+ 81: [0.19444, 0.68611, 0, 0, 0.86388],
+ 82: [0, 0.68611, 0, 0, 0.8625],
+ 83: [0, 0.68611, 0, 0, 0.63889],
+ 84: [0, 0.68611, 0, 0, 0.8],
+ 85: [0, 0.68611, 0, 0, 0.88472],
+ 86: [0, 0.68611, 0.01597, 0, 0.86944],
+ 87: [0, 0.68611, 0.01597, 0, 1.18888],
+ 88: [0, 0.68611, 0, 0, 0.86944],
+ 89: [0, 0.68611, 0.02875, 0, 0.86944],
+ 90: [0, 0.68611, 0, 0, 0.70277],
+ 91: [0.25, 0.75, 0, 0, 0.31944],
+ 92: [0.25, 0.75, 0, 0, 0.575],
+ 93: [0.25, 0.75, 0, 0, 0.31944],
+ 94: [0, 0.69444, 0, 0, 0.575],
+ 95: [0.31, 0.13444, 0.03194, 0, 0.575],
+ 97: [0, 0.44444, 0, 0, 0.55902],
+ 98: [0, 0.69444, 0, 0, 0.63889],
+ 99: [0, 0.44444, 0, 0, 0.51111],
+ 100: [0, 0.69444, 0, 0, 0.63889],
+ 101: [0, 0.44444, 0, 0, 0.52708],
+ 102: [0, 0.69444, 0.10903, 0, 0.35139],
+ 103: [0.19444, 0.44444, 0.01597, 0, 0.575],
+ 104: [0, 0.69444, 0, 0, 0.63889],
+ 105: [0, 0.69444, 0, 0, 0.31944],
+ 106: [0.19444, 0.69444, 0, 0, 0.35139],
+ 107: [0, 0.69444, 0, 0, 0.60694],
+ 108: [0, 0.69444, 0, 0, 0.31944],
+ 109: [0, 0.44444, 0, 0, 0.95833],
+ 110: [0, 0.44444, 0, 0, 0.63889],
+ 111: [0, 0.44444, 0, 0, 0.575],
+ 112: [0.19444, 0.44444, 0, 0, 0.63889],
+ 113: [0.19444, 0.44444, 0, 0, 0.60694],
+ 114: [0, 0.44444, 0, 0, 0.47361],
+ 115: [0, 0.44444, 0, 0, 0.45361],
+ 116: [0, 0.63492, 0, 0, 0.44722],
+ 117: [0, 0.44444, 0, 0, 0.63889],
+ 118: [0, 0.44444, 0.01597, 0, 0.60694],
+ 119: [0, 0.44444, 0.01597, 0, 0.83055],
+ 120: [0, 0.44444, 0, 0, 0.60694],
+ 121: [0.19444, 0.44444, 0.01597, 0, 0.60694],
+ 122: [0, 0.44444, 0, 0, 0.51111],
+ 123: [0.25, 0.75, 0, 0, 0.575],
+ 124: [0.25, 0.75, 0, 0, 0.31944],
+ 125: [0.25, 0.75, 0, 0, 0.575],
+ 126: [0.35, 0.34444, 0, 0, 0.575],
+ 160: [0, 0, 0, 0, 0.25],
+ 163: [0, 0.69444, 0, 0, 0.86853],
+ 168: [0, 0.69444, 0, 0, 0.575],
+ 172: [0, 0.44444, 0, 0, 0.76666],
+ 176: [0, 0.69444, 0, 0, 0.86944],
+ 177: [0.13333, 0.63333, 0, 0, 0.89444],
+ 184: [0.17014, 0, 0, 0, 0.51111],
+ 198: [0, 0.68611, 0, 0, 1.04166],
+ 215: [0.13333, 0.63333, 0, 0, 0.89444],
+ 216: [0.04861, 0.73472, 0, 0, 0.89444],
+ 223: [0, 0.69444, 0, 0, 0.59722],
+ 230: [0, 0.44444, 0, 0, 0.83055],
+ 247: [0.13333, 0.63333, 0, 0, 0.89444],
+ 248: [0.09722, 0.54167, 0, 0, 0.575],
+ 305: [0, 0.44444, 0, 0, 0.31944],
+ 338: [0, 0.68611, 0, 0, 1.16944],
+ 339: [0, 0.44444, 0, 0, 0.89444],
+ 567: [0.19444, 0.44444, 0, 0, 0.35139],
+ 710: [0, 0.69444, 0, 0, 0.575],
+ 711: [0, 0.63194, 0, 0, 0.575],
+ 713: [0, 0.59611, 0, 0, 0.575],
+ 714: [0, 0.69444, 0, 0, 0.575],
+ 715: [0, 0.69444, 0, 0, 0.575],
+ 728: [0, 0.69444, 0, 0, 0.575],
+ 729: [0, 0.69444, 0, 0, 0.31944],
+ 730: [0, 0.69444, 0, 0, 0.86944],
+ 732: [0, 0.69444, 0, 0, 0.575],
+ 733: [0, 0.69444, 0, 0, 0.575],
+ 915: [0, 0.68611, 0, 0, 0.69166],
+ 916: [0, 0.68611, 0, 0, 0.95833],
+ 920: [0, 0.68611, 0, 0, 0.89444],
+ 923: [0, 0.68611, 0, 0, 0.80555],
+ 926: [0, 0.68611, 0, 0, 0.76666],
+ 928: [0, 0.68611, 0, 0, 0.9],
+ 931: [0, 0.68611, 0, 0, 0.83055],
+ 933: [0, 0.68611, 0, 0, 0.89444],
+ 934: [0, 0.68611, 0, 0, 0.83055],
+ 936: [0, 0.68611, 0, 0, 0.89444],
+ 937: [0, 0.68611, 0, 0, 0.83055],
+ 8211: [0, 0.44444, 0.03194, 0, 0.575],
+ 8212: [0, 0.44444, 0.03194, 0, 1.14999],
+ 8216: [0, 0.69444, 0, 0, 0.31944],
+ 8217: [0, 0.69444, 0, 0, 0.31944],
+ 8220: [0, 0.69444, 0, 0, 0.60278],
+ 8221: [0, 0.69444, 0, 0, 0.60278],
+ 8224: [0.19444, 0.69444, 0, 0, 0.51111],
+ 8225: [0.19444, 0.69444, 0, 0, 0.51111],
+ 8242: [0, 0.55556, 0, 0, 0.34444],
+ 8407: [0, 0.72444, 0.15486, 0, 0.575],
+ 8463: [0, 0.69444, 0, 0, 0.66759],
+ 8465: [0, 0.69444, 0, 0, 0.83055],
+ 8467: [0, 0.69444, 0, 0, 0.47361],
+ 8472: [0.19444, 0.44444, 0, 0, 0.74027],
+ 8476: [0, 0.69444, 0, 0, 0.83055],
+ 8501: [0, 0.69444, 0, 0, 0.70277],
+ 8592: [-0.10889, 0.39111, 0, 0, 1.14999],
+ 8593: [0.19444, 0.69444, 0, 0, 0.575],
+ 8594: [-0.10889, 0.39111, 0, 0, 1.14999],
+ 8595: [0.19444, 0.69444, 0, 0, 0.575],
+ 8596: [-0.10889, 0.39111, 0, 0, 1.14999],
+ 8597: [0.25, 0.75, 0, 0, 0.575],
+ 8598: [0.19444, 0.69444, 0, 0, 1.14999],
+ 8599: [0.19444, 0.69444, 0, 0, 1.14999],
+ 8600: [0.19444, 0.69444, 0, 0, 1.14999],
+ 8601: [0.19444, 0.69444, 0, 0, 1.14999],
+ 8636: [-0.10889, 0.39111, 0, 0, 1.14999],
+ 8637: [-0.10889, 0.39111, 0, 0, 1.14999],
+ 8640: [-0.10889, 0.39111, 0, 0, 1.14999],
+ 8641: [-0.10889, 0.39111, 0, 0, 1.14999],
+ 8656: [-0.10889, 0.39111, 0, 0, 1.14999],
+ 8657: [0.19444, 0.69444, 0, 0, 0.70277],
+ 8658: [-0.10889, 0.39111, 0, 0, 1.14999],
+ 8659: [0.19444, 0.69444, 0, 0, 0.70277],
+ 8660: [-0.10889, 0.39111, 0, 0, 1.14999],
+ 8661: [0.25, 0.75, 0, 0, 0.70277],
+ 8704: [0, 0.69444, 0, 0, 0.63889],
+ 8706: [0, 0.69444, 0.06389, 0, 0.62847],
+ 8707: [0, 0.69444, 0, 0, 0.63889],
+ 8709: [0.05556, 0.75, 0, 0, 0.575],
+ 8711: [0, 0.68611, 0, 0, 0.95833],
+ 8712: [0.08556, 0.58556, 0, 0, 0.76666],
+ 8715: [0.08556, 0.58556, 0, 0, 0.76666],
+ 8722: [0.13333, 0.63333, 0, 0, 0.89444],
+ 8723: [0.13333, 0.63333, 0, 0, 0.89444],
+ 8725: [0.25, 0.75, 0, 0, 0.575],
+ 8726: [0.25, 0.75, 0, 0, 0.575],
+ 8727: [-0.02778, 0.47222, 0, 0, 0.575],
+ 8728: [-0.02639, 0.47361, 0, 0, 0.575],
+ 8729: [-0.02639, 0.47361, 0, 0, 0.575],
+ 8730: [0.18, 0.82, 0, 0, 0.95833],
+ 8733: [0, 0.44444, 0, 0, 0.89444],
+ 8734: [0, 0.44444, 0, 0, 1.14999],
+ 8736: [0, 0.69224, 0, 0, 0.72222],
+ 8739: [0.25, 0.75, 0, 0, 0.31944],
+ 8741: [0.25, 0.75, 0, 0, 0.575],
+ 8743: [0, 0.55556, 0, 0, 0.76666],
+ 8744: [0, 0.55556, 0, 0, 0.76666],
+ 8745: [0, 0.55556, 0, 0, 0.76666],
+ 8746: [0, 0.55556, 0, 0, 0.76666],
+ 8747: [0.19444, 0.69444, 0.12778, 0, 0.56875],
+ 8764: [-0.10889, 0.39111, 0, 0, 0.89444],
+ 8768: [0.19444, 0.69444, 0, 0, 0.31944],
+ 8771: [222e-5, 0.50222, 0, 0, 0.89444],
+ 8773: [0.027, 0.638, 0, 0, 0.894],
+ 8776: [0.02444, 0.52444, 0, 0, 0.89444],
+ 8781: [222e-5, 0.50222, 0, 0, 0.89444],
+ 8801: [222e-5, 0.50222, 0, 0, 0.89444],
+ 8804: [0.19667, 0.69667, 0, 0, 0.89444],
+ 8805: [0.19667, 0.69667, 0, 0, 0.89444],
+ 8810: [0.08556, 0.58556, 0, 0, 1.14999],
+ 8811: [0.08556, 0.58556, 0, 0, 1.14999],
+ 8826: [0.08556, 0.58556, 0, 0, 0.89444],
+ 8827: [0.08556, 0.58556, 0, 0, 0.89444],
+ 8834: [0.08556, 0.58556, 0, 0, 0.89444],
+ 8835: [0.08556, 0.58556, 0, 0, 0.89444],
+ 8838: [0.19667, 0.69667, 0, 0, 0.89444],
+ 8839: [0.19667, 0.69667, 0, 0, 0.89444],
+ 8846: [0, 0.55556, 0, 0, 0.76666],
+ 8849: [0.19667, 0.69667, 0, 0, 0.89444],
+ 8850: [0.19667, 0.69667, 0, 0, 0.89444],
+ 8851: [0, 0.55556, 0, 0, 0.76666],
+ 8852: [0, 0.55556, 0, 0, 0.76666],
+ 8853: [0.13333, 0.63333, 0, 0, 0.89444],
+ 8854: [0.13333, 0.63333, 0, 0, 0.89444],
+ 8855: [0.13333, 0.63333, 0, 0, 0.89444],
+ 8856: [0.13333, 0.63333, 0, 0, 0.89444],
+ 8857: [0.13333, 0.63333, 0, 0, 0.89444],
+ 8866: [0, 0.69444, 0, 0, 0.70277],
+ 8867: [0, 0.69444, 0, 0, 0.70277],
+ 8868: [0, 0.69444, 0, 0, 0.89444],
+ 8869: [0, 0.69444, 0, 0, 0.89444],
+ 8900: [-0.02639, 0.47361, 0, 0, 0.575],
+ 8901: [-0.02639, 0.47361, 0, 0, 0.31944],
+ 8902: [-0.02778, 0.47222, 0, 0, 0.575],
+ 8968: [0.25, 0.75, 0, 0, 0.51111],
+ 8969: [0.25, 0.75, 0, 0, 0.51111],
+ 8970: [0.25, 0.75, 0, 0, 0.51111],
+ 8971: [0.25, 0.75, 0, 0, 0.51111],
+ 8994: [-0.13889, 0.36111, 0, 0, 1.14999],
+ 8995: [-0.13889, 0.36111, 0, 0, 1.14999],
+ 9651: [0.19444, 0.69444, 0, 0, 1.02222],
+ 9657: [-0.02778, 0.47222, 0, 0, 0.575],
+ 9661: [0.19444, 0.69444, 0, 0, 1.02222],
+ 9667: [-0.02778, 0.47222, 0, 0, 0.575],
+ 9711: [0.19444, 0.69444, 0, 0, 1.14999],
+ 9824: [0.12963, 0.69444, 0, 0, 0.89444],
+ 9825: [0.12963, 0.69444, 0, 0, 0.89444],
+ 9826: [0.12963, 0.69444, 0, 0, 0.89444],
+ 9827: [0.12963, 0.69444, 0, 0, 0.89444],
+ 9837: [0, 0.75, 0, 0, 0.44722],
+ 9838: [0.19444, 0.69444, 0, 0, 0.44722],
+ 9839: [0.19444, 0.69444, 0, 0, 0.44722],
+ 10216: [0.25, 0.75, 0, 0, 0.44722],
+ 10217: [0.25, 0.75, 0, 0, 0.44722],
+ 10815: [0, 0.68611, 0, 0, 0.9],
+ 10927: [0.19667, 0.69667, 0, 0, 0.89444],
+ 10928: [0.19667, 0.69667, 0, 0, 0.89444],
+ 57376: [0.19444, 0.69444, 0, 0, 0]
+ },
+ "Main-BoldItalic": {
+ 32: [0, 0, 0, 0, 0.25],
+ 33: [0, 0.69444, 0.11417, 0, 0.38611],
+ 34: [0, 0.69444, 0.07939, 0, 0.62055],
+ 35: [0.19444, 0.69444, 0.06833, 0, 0.94444],
+ 37: [0.05556, 0.75, 0.12861, 0, 0.94444],
+ 38: [0, 0.69444, 0.08528, 0, 0.88555],
+ 39: [0, 0.69444, 0.12945, 0, 0.35555],
+ 40: [0.25, 0.75, 0.15806, 0, 0.47333],
+ 41: [0.25, 0.75, 0.03306, 0, 0.47333],
+ 42: [0, 0.75, 0.14333, 0, 0.59111],
+ 43: [0.10333, 0.60333, 0.03306, 0, 0.88555],
+ 44: [0.19444, 0.14722, 0, 0, 0.35555],
+ 45: [0, 0.44444, 0.02611, 0, 0.41444],
+ 46: [0, 0.14722, 0, 0, 0.35555],
+ 47: [0.25, 0.75, 0.15806, 0, 0.59111],
+ 48: [0, 0.64444, 0.13167, 0, 0.59111],
+ 49: [0, 0.64444, 0.13167, 0, 0.59111],
+ 50: [0, 0.64444, 0.13167, 0, 0.59111],
+ 51: [0, 0.64444, 0.13167, 0, 0.59111],
+ 52: [0.19444, 0.64444, 0.13167, 0, 0.59111],
+ 53: [0, 0.64444, 0.13167, 0, 0.59111],
+ 54: [0, 0.64444, 0.13167, 0, 0.59111],
+ 55: [0.19444, 0.64444, 0.13167, 0, 0.59111],
+ 56: [0, 0.64444, 0.13167, 0, 0.59111],
+ 57: [0, 0.64444, 0.13167, 0, 0.59111],
+ 58: [0, 0.44444, 0.06695, 0, 0.35555],
+ 59: [0.19444, 0.44444, 0.06695, 0, 0.35555],
+ 61: [-0.10889, 0.39111, 0.06833, 0, 0.88555],
+ 63: [0, 0.69444, 0.11472, 0, 0.59111],
+ 64: [0, 0.69444, 0.09208, 0, 0.88555],
+ 65: [0, 0.68611, 0, 0, 0.86555],
+ 66: [0, 0.68611, 0.0992, 0, 0.81666],
+ 67: [0, 0.68611, 0.14208, 0, 0.82666],
+ 68: [0, 0.68611, 0.09062, 0, 0.87555],
+ 69: [0, 0.68611, 0.11431, 0, 0.75666],
+ 70: [0, 0.68611, 0.12903, 0, 0.72722],
+ 71: [0, 0.68611, 0.07347, 0, 0.89527],
+ 72: [0, 0.68611, 0.17208, 0, 0.8961],
+ 73: [0, 0.68611, 0.15681, 0, 0.47166],
+ 74: [0, 0.68611, 0.145, 0, 0.61055],
+ 75: [0, 0.68611, 0.14208, 0, 0.89499],
+ 76: [0, 0.68611, 0, 0, 0.69777],
+ 77: [0, 0.68611, 0.17208, 0, 1.07277],
+ 78: [0, 0.68611, 0.17208, 0, 0.8961],
+ 79: [0, 0.68611, 0.09062, 0, 0.85499],
+ 80: [0, 0.68611, 0.0992, 0, 0.78721],
+ 81: [0.19444, 0.68611, 0.09062, 0, 0.85499],
+ 82: [0, 0.68611, 0.02559, 0, 0.85944],
+ 83: [0, 0.68611, 0.11264, 0, 0.64999],
+ 84: [0, 0.68611, 0.12903, 0, 0.7961],
+ 85: [0, 0.68611, 0.17208, 0, 0.88083],
+ 86: [0, 0.68611, 0.18625, 0, 0.86555],
+ 87: [0, 0.68611, 0.18625, 0, 1.15999],
+ 88: [0, 0.68611, 0.15681, 0, 0.86555],
+ 89: [0, 0.68611, 0.19803, 0, 0.86555],
+ 90: [0, 0.68611, 0.14208, 0, 0.70888],
+ 91: [0.25, 0.75, 0.1875, 0, 0.35611],
+ 93: [0.25, 0.75, 0.09972, 0, 0.35611],
+ 94: [0, 0.69444, 0.06709, 0, 0.59111],
+ 95: [0.31, 0.13444, 0.09811, 0, 0.59111],
+ 97: [0, 0.44444, 0.09426, 0, 0.59111],
+ 98: [0, 0.69444, 0.07861, 0, 0.53222],
+ 99: [0, 0.44444, 0.05222, 0, 0.53222],
+ 100: [0, 0.69444, 0.10861, 0, 0.59111],
+ 101: [0, 0.44444, 0.085, 0, 0.53222],
+ 102: [0.19444, 0.69444, 0.21778, 0, 0.4],
+ 103: [0.19444, 0.44444, 0.105, 0, 0.53222],
+ 104: [0, 0.69444, 0.09426, 0, 0.59111],
+ 105: [0, 0.69326, 0.11387, 0, 0.35555],
+ 106: [0.19444, 0.69326, 0.1672, 0, 0.35555],
+ 107: [0, 0.69444, 0.11111, 0, 0.53222],
+ 108: [0, 0.69444, 0.10861, 0, 0.29666],
+ 109: [0, 0.44444, 0.09426, 0, 0.94444],
+ 110: [0, 0.44444, 0.09426, 0, 0.64999],
+ 111: [0, 0.44444, 0.07861, 0, 0.59111],
+ 112: [0.19444, 0.44444, 0.07861, 0, 0.59111],
+ 113: [0.19444, 0.44444, 0.105, 0, 0.53222],
+ 114: [0, 0.44444, 0.11111, 0, 0.50167],
+ 115: [0, 0.44444, 0.08167, 0, 0.48694],
+ 116: [0, 0.63492, 0.09639, 0, 0.385],
+ 117: [0, 0.44444, 0.09426, 0, 0.62055],
+ 118: [0, 0.44444, 0.11111, 0, 0.53222],
+ 119: [0, 0.44444, 0.11111, 0, 0.76777],
+ 120: [0, 0.44444, 0.12583, 0, 0.56055],
+ 121: [0.19444, 0.44444, 0.105, 0, 0.56166],
+ 122: [0, 0.44444, 0.13889, 0, 0.49055],
+ 126: [0.35, 0.34444, 0.11472, 0, 0.59111],
+ 160: [0, 0, 0, 0, 0.25],
+ 168: [0, 0.69444, 0.11473, 0, 0.59111],
+ 176: [0, 0.69444, 0, 0, 0.94888],
+ 184: [0.17014, 0, 0, 0, 0.53222],
+ 198: [0, 0.68611, 0.11431, 0, 1.02277],
+ 216: [0.04861, 0.73472, 0.09062, 0, 0.88555],
+ 223: [0.19444, 0.69444, 0.09736, 0, 0.665],
+ 230: [0, 0.44444, 0.085, 0, 0.82666],
+ 248: [0.09722, 0.54167, 0.09458, 0, 0.59111],
+ 305: [0, 0.44444, 0.09426, 0, 0.35555],
+ 338: [0, 0.68611, 0.11431, 0, 1.14054],
+ 339: [0, 0.44444, 0.085, 0, 0.82666],
+ 567: [0.19444, 0.44444, 0.04611, 0, 0.385],
+ 710: [0, 0.69444, 0.06709, 0, 0.59111],
+ 711: [0, 0.63194, 0.08271, 0, 0.59111],
+ 713: [0, 0.59444, 0.10444, 0, 0.59111],
+ 714: [0, 0.69444, 0.08528, 0, 0.59111],
+ 715: [0, 0.69444, 0, 0, 0.59111],
+ 728: [0, 0.69444, 0.10333, 0, 0.59111],
+ 729: [0, 0.69444, 0.12945, 0, 0.35555],
+ 730: [0, 0.69444, 0, 0, 0.94888],
+ 732: [0, 0.69444, 0.11472, 0, 0.59111],
+ 733: [0, 0.69444, 0.11472, 0, 0.59111],
+ 915: [0, 0.68611, 0.12903, 0, 0.69777],
+ 916: [0, 0.68611, 0, 0, 0.94444],
+ 920: [0, 0.68611, 0.09062, 0, 0.88555],
+ 923: [0, 0.68611, 0, 0, 0.80666],
+ 926: [0, 0.68611, 0.15092, 0, 0.76777],
+ 928: [0, 0.68611, 0.17208, 0, 0.8961],
+ 931: [0, 0.68611, 0.11431, 0, 0.82666],
+ 933: [0, 0.68611, 0.10778, 0, 0.88555],
+ 934: [0, 0.68611, 0.05632, 0, 0.82666],
+ 936: [0, 0.68611, 0.10778, 0, 0.88555],
+ 937: [0, 0.68611, 0.0992, 0, 0.82666],
+ 8211: [0, 0.44444, 0.09811, 0, 0.59111],
+ 8212: [0, 0.44444, 0.09811, 0, 1.18221],
+ 8216: [0, 0.69444, 0.12945, 0, 0.35555],
+ 8217: [0, 0.69444, 0.12945, 0, 0.35555],
+ 8220: [0, 0.69444, 0.16772, 0, 0.62055],
+ 8221: [0, 0.69444, 0.07939, 0, 0.62055]
+ },
+ "Main-Italic": {
+ 32: [0, 0, 0, 0, 0.25],
+ 33: [0, 0.69444, 0.12417, 0, 0.30667],
+ 34: [0, 0.69444, 0.06961, 0, 0.51444],
+ 35: [0.19444, 0.69444, 0.06616, 0, 0.81777],
+ 37: [0.05556, 0.75, 0.13639, 0, 0.81777],
+ 38: [0, 0.69444, 0.09694, 0, 0.76666],
+ 39: [0, 0.69444, 0.12417, 0, 0.30667],
+ 40: [0.25, 0.75, 0.16194, 0, 0.40889],
+ 41: [0.25, 0.75, 0.03694, 0, 0.40889],
+ 42: [0, 0.75, 0.14917, 0, 0.51111],
+ 43: [0.05667, 0.56167, 0.03694, 0, 0.76666],
+ 44: [0.19444, 0.10556, 0, 0, 0.30667],
+ 45: [0, 0.43056, 0.02826, 0, 0.35778],
+ 46: [0, 0.10556, 0, 0, 0.30667],
+ 47: [0.25, 0.75, 0.16194, 0, 0.51111],
+ 48: [0, 0.64444, 0.13556, 0, 0.51111],
+ 49: [0, 0.64444, 0.13556, 0, 0.51111],
+ 50: [0, 0.64444, 0.13556, 0, 0.51111],
+ 51: [0, 0.64444, 0.13556, 0, 0.51111],
+ 52: [0.19444, 0.64444, 0.13556, 0, 0.51111],
+ 53: [0, 0.64444, 0.13556, 0, 0.51111],
+ 54: [0, 0.64444, 0.13556, 0, 0.51111],
+ 55: [0.19444, 0.64444, 0.13556, 0, 0.51111],
+ 56: [0, 0.64444, 0.13556, 0, 0.51111],
+ 57: [0, 0.64444, 0.13556, 0, 0.51111],
+ 58: [0, 0.43056, 0.0582, 0, 0.30667],
+ 59: [0.19444, 0.43056, 0.0582, 0, 0.30667],
+ 61: [-0.13313, 0.36687, 0.06616, 0, 0.76666],
+ 63: [0, 0.69444, 0.1225, 0, 0.51111],
+ 64: [0, 0.69444, 0.09597, 0, 0.76666],
+ 65: [0, 0.68333, 0, 0, 0.74333],
+ 66: [0, 0.68333, 0.10257, 0, 0.70389],
+ 67: [0, 0.68333, 0.14528, 0, 0.71555],
+ 68: [0, 0.68333, 0.09403, 0, 0.755],
+ 69: [0, 0.68333, 0.12028, 0, 0.67833],
+ 70: [0, 0.68333, 0.13305, 0, 0.65277],
+ 71: [0, 0.68333, 0.08722, 0, 0.77361],
+ 72: [0, 0.68333, 0.16389, 0, 0.74333],
+ 73: [0, 0.68333, 0.15806, 0, 0.38555],
+ 74: [0, 0.68333, 0.14028, 0, 0.525],
+ 75: [0, 0.68333, 0.14528, 0, 0.76888],
+ 76: [0, 0.68333, 0, 0, 0.62722],
+ 77: [0, 0.68333, 0.16389, 0, 0.89666],
+ 78: [0, 0.68333, 0.16389, 0, 0.74333],
+ 79: [0, 0.68333, 0.09403, 0, 0.76666],
+ 80: [0, 0.68333, 0.10257, 0, 0.67833],
+ 81: [0.19444, 0.68333, 0.09403, 0, 0.76666],
+ 82: [0, 0.68333, 0.03868, 0, 0.72944],
+ 83: [0, 0.68333, 0.11972, 0, 0.56222],
+ 84: [0, 0.68333, 0.13305, 0, 0.71555],
+ 85: [0, 0.68333, 0.16389, 0, 0.74333],
+ 86: [0, 0.68333, 0.18361, 0, 0.74333],
+ 87: [0, 0.68333, 0.18361, 0, 0.99888],
+ 88: [0, 0.68333, 0.15806, 0, 0.74333],
+ 89: [0, 0.68333, 0.19383, 0, 0.74333],
+ 90: [0, 0.68333, 0.14528, 0, 0.61333],
+ 91: [0.25, 0.75, 0.1875, 0, 0.30667],
+ 93: [0.25, 0.75, 0.10528, 0, 0.30667],
+ 94: [0, 0.69444, 0.06646, 0, 0.51111],
+ 95: [0.31, 0.12056, 0.09208, 0, 0.51111],
+ 97: [0, 0.43056, 0.07671, 0, 0.51111],
+ 98: [0, 0.69444, 0.06312, 0, 0.46],
+ 99: [0, 0.43056, 0.05653, 0, 0.46],
+ 100: [0, 0.69444, 0.10333, 0, 0.51111],
+ 101: [0, 0.43056, 0.07514, 0, 0.46],
+ 102: [0.19444, 0.69444, 0.21194, 0, 0.30667],
+ 103: [0.19444, 0.43056, 0.08847, 0, 0.46],
+ 104: [0, 0.69444, 0.07671, 0, 0.51111],
+ 105: [0, 0.65536, 0.1019, 0, 0.30667],
+ 106: [0.19444, 0.65536, 0.14467, 0, 0.30667],
+ 107: [0, 0.69444, 0.10764, 0, 0.46],
+ 108: [0, 0.69444, 0.10333, 0, 0.25555],
+ 109: [0, 0.43056, 0.07671, 0, 0.81777],
+ 110: [0, 0.43056, 0.07671, 0, 0.56222],
+ 111: [0, 0.43056, 0.06312, 0, 0.51111],
+ 112: [0.19444, 0.43056, 0.06312, 0, 0.51111],
+ 113: [0.19444, 0.43056, 0.08847, 0, 0.46],
+ 114: [0, 0.43056, 0.10764, 0, 0.42166],
+ 115: [0, 0.43056, 0.08208, 0, 0.40889],
+ 116: [0, 0.61508, 0.09486, 0, 0.33222],
+ 117: [0, 0.43056, 0.07671, 0, 0.53666],
+ 118: [0, 0.43056, 0.10764, 0, 0.46],
+ 119: [0, 0.43056, 0.10764, 0, 0.66444],
+ 120: [0, 0.43056, 0.12042, 0, 0.46389],
+ 121: [0.19444, 0.43056, 0.08847, 0, 0.48555],
+ 122: [0, 0.43056, 0.12292, 0, 0.40889],
+ 126: [0.35, 0.31786, 0.11585, 0, 0.51111],
+ 160: [0, 0, 0, 0, 0.25],
+ 168: [0, 0.66786, 0.10474, 0, 0.51111],
+ 176: [0, 0.69444, 0, 0, 0.83129],
+ 184: [0.17014, 0, 0, 0, 0.46],
+ 198: [0, 0.68333, 0.12028, 0, 0.88277],
+ 216: [0.04861, 0.73194, 0.09403, 0, 0.76666],
+ 223: [0.19444, 0.69444, 0.10514, 0, 0.53666],
+ 230: [0, 0.43056, 0.07514, 0, 0.71555],
+ 248: [0.09722, 0.52778, 0.09194, 0, 0.51111],
+ 338: [0, 0.68333, 0.12028, 0, 0.98499],
+ 339: [0, 0.43056, 0.07514, 0, 0.71555],
+ 710: [0, 0.69444, 0.06646, 0, 0.51111],
+ 711: [0, 0.62847, 0.08295, 0, 0.51111],
+ 713: [0, 0.56167, 0.10333, 0, 0.51111],
+ 714: [0, 0.69444, 0.09694, 0, 0.51111],
+ 715: [0, 0.69444, 0, 0, 0.51111],
+ 728: [0, 0.69444, 0.10806, 0, 0.51111],
+ 729: [0, 0.66786, 0.11752, 0, 0.30667],
+ 730: [0, 0.69444, 0, 0, 0.83129],
+ 732: [0, 0.66786, 0.11585, 0, 0.51111],
+ 733: [0, 0.69444, 0.1225, 0, 0.51111],
+ 915: [0, 0.68333, 0.13305, 0, 0.62722],
+ 916: [0, 0.68333, 0, 0, 0.81777],
+ 920: [0, 0.68333, 0.09403, 0, 0.76666],
+ 923: [0, 0.68333, 0, 0, 0.69222],
+ 926: [0, 0.68333, 0.15294, 0, 0.66444],
+ 928: [0, 0.68333, 0.16389, 0, 0.74333],
+ 931: [0, 0.68333, 0.12028, 0, 0.71555],
+ 933: [0, 0.68333, 0.11111, 0, 0.76666],
+ 934: [0, 0.68333, 0.05986, 0, 0.71555],
+ 936: [0, 0.68333, 0.11111, 0, 0.76666],
+ 937: [0, 0.68333, 0.10257, 0, 0.71555],
+ 8211: [0, 0.43056, 0.09208, 0, 0.51111],
+ 8212: [0, 0.43056, 0.09208, 0, 1.02222],
+ 8216: [0, 0.69444, 0.12417, 0, 0.30667],
+ 8217: [0, 0.69444, 0.12417, 0, 0.30667],
+ 8220: [0, 0.69444, 0.1685, 0, 0.51444],
+ 8221: [0, 0.69444, 0.06961, 0, 0.51444],
+ 8463: [0, 0.68889, 0, 0, 0.54028]
+ },
+ "Main-Regular": {
+ 32: [0, 0, 0, 0, 0.25],
+ 33: [0, 0.69444, 0, 0, 0.27778],
+ 34: [0, 0.69444, 0, 0, 0.5],
+ 35: [0.19444, 0.69444, 0, 0, 0.83334],
+ 36: [0.05556, 0.75, 0, 0, 0.5],
+ 37: [0.05556, 0.75, 0, 0, 0.83334],
+ 38: [0, 0.69444, 0, 0, 0.77778],
+ 39: [0, 0.69444, 0, 0, 0.27778],
+ 40: [0.25, 0.75, 0, 0, 0.38889],
+ 41: [0.25, 0.75, 0, 0, 0.38889],
+ 42: [0, 0.75, 0, 0, 0.5],
+ 43: [0.08333, 0.58333, 0, 0, 0.77778],
+ 44: [0.19444, 0.10556, 0, 0, 0.27778],
+ 45: [0, 0.43056, 0, 0, 0.33333],
+ 46: [0, 0.10556, 0, 0, 0.27778],
+ 47: [0.25, 0.75, 0, 0, 0.5],
+ 48: [0, 0.64444, 0, 0, 0.5],
+ 49: [0, 0.64444, 0, 0, 0.5],
+ 50: [0, 0.64444, 0, 0, 0.5],
+ 51: [0, 0.64444, 0, 0, 0.5],
+ 52: [0, 0.64444, 0, 0, 0.5],
+ 53: [0, 0.64444, 0, 0, 0.5],
+ 54: [0, 0.64444, 0, 0, 0.5],
+ 55: [0, 0.64444, 0, 0, 0.5],
+ 56: [0, 0.64444, 0, 0, 0.5],
+ 57: [0, 0.64444, 0, 0, 0.5],
+ 58: [0, 0.43056, 0, 0, 0.27778],
+ 59: [0.19444, 0.43056, 0, 0, 0.27778],
+ 60: [0.0391, 0.5391, 0, 0, 0.77778],
+ 61: [-0.13313, 0.36687, 0, 0, 0.77778],
+ 62: [0.0391, 0.5391, 0, 0, 0.77778],
+ 63: [0, 0.69444, 0, 0, 0.47222],
+ 64: [0, 0.69444, 0, 0, 0.77778],
+ 65: [0, 0.68333, 0, 0, 0.75],
+ 66: [0, 0.68333, 0, 0, 0.70834],
+ 67: [0, 0.68333, 0, 0, 0.72222],
+ 68: [0, 0.68333, 0, 0, 0.76389],
+ 69: [0, 0.68333, 0, 0, 0.68056],
+ 70: [0, 0.68333, 0, 0, 0.65278],
+ 71: [0, 0.68333, 0, 0, 0.78472],
+ 72: [0, 0.68333, 0, 0, 0.75],
+ 73: [0, 0.68333, 0, 0, 0.36111],
+ 74: [0, 0.68333, 0, 0, 0.51389],
+ 75: [0, 0.68333, 0, 0, 0.77778],
+ 76: [0, 0.68333, 0, 0, 0.625],
+ 77: [0, 0.68333, 0, 0, 0.91667],
+ 78: [0, 0.68333, 0, 0, 0.75],
+ 79: [0, 0.68333, 0, 0, 0.77778],
+ 80: [0, 0.68333, 0, 0, 0.68056],
+ 81: [0.19444, 0.68333, 0, 0, 0.77778],
+ 82: [0, 0.68333, 0, 0, 0.73611],
+ 83: [0, 0.68333, 0, 0, 0.55556],
+ 84: [0, 0.68333, 0, 0, 0.72222],
+ 85: [0, 0.68333, 0, 0, 0.75],
+ 86: [0, 0.68333, 0.01389, 0, 0.75],
+ 87: [0, 0.68333, 0.01389, 0, 1.02778],
+ 88: [0, 0.68333, 0, 0, 0.75],
+ 89: [0, 0.68333, 0.025, 0, 0.75],
+ 90: [0, 0.68333, 0, 0, 0.61111],
+ 91: [0.25, 0.75, 0, 0, 0.27778],
+ 92: [0.25, 0.75, 0, 0, 0.5],
+ 93: [0.25, 0.75, 0, 0, 0.27778],
+ 94: [0, 0.69444, 0, 0, 0.5],
+ 95: [0.31, 0.12056, 0.02778, 0, 0.5],
+ 97: [0, 0.43056, 0, 0, 0.5],
+ 98: [0, 0.69444, 0, 0, 0.55556],
+ 99: [0, 0.43056, 0, 0, 0.44445],
+ 100: [0, 0.69444, 0, 0, 0.55556],
+ 101: [0, 0.43056, 0, 0, 0.44445],
+ 102: [0, 0.69444, 0.07778, 0, 0.30556],
+ 103: [0.19444, 0.43056, 0.01389, 0, 0.5],
+ 104: [0, 0.69444, 0, 0, 0.55556],
+ 105: [0, 0.66786, 0, 0, 0.27778],
+ 106: [0.19444, 0.66786, 0, 0, 0.30556],
+ 107: [0, 0.69444, 0, 0, 0.52778],
+ 108: [0, 0.69444, 0, 0, 0.27778],
+ 109: [0, 0.43056, 0, 0, 0.83334],
+ 110: [0, 0.43056, 0, 0, 0.55556],
+ 111: [0, 0.43056, 0, 0, 0.5],
+ 112: [0.19444, 0.43056, 0, 0, 0.55556],
+ 113: [0.19444, 0.43056, 0, 0, 0.52778],
+ 114: [0, 0.43056, 0, 0, 0.39167],
+ 115: [0, 0.43056, 0, 0, 0.39445],
+ 116: [0, 0.61508, 0, 0, 0.38889],
+ 117: [0, 0.43056, 0, 0, 0.55556],
+ 118: [0, 0.43056, 0.01389, 0, 0.52778],
+ 119: [0, 0.43056, 0.01389, 0, 0.72222],
+ 120: [0, 0.43056, 0, 0, 0.52778],
+ 121: [0.19444, 0.43056, 0.01389, 0, 0.52778],
+ 122: [0, 0.43056, 0, 0, 0.44445],
+ 123: [0.25, 0.75, 0, 0, 0.5],
+ 124: [0.25, 0.75, 0, 0, 0.27778],
+ 125: [0.25, 0.75, 0, 0, 0.5],
+ 126: [0.35, 0.31786, 0, 0, 0.5],
+ 160: [0, 0, 0, 0, 0.25],
+ 163: [0, 0.69444, 0, 0, 0.76909],
+ 167: [0.19444, 0.69444, 0, 0, 0.44445],
+ 168: [0, 0.66786, 0, 0, 0.5],
+ 172: [0, 0.43056, 0, 0, 0.66667],
+ 176: [0, 0.69444, 0, 0, 0.75],
+ 177: [0.08333, 0.58333, 0, 0, 0.77778],
+ 182: [0.19444, 0.69444, 0, 0, 0.61111],
+ 184: [0.17014, 0, 0, 0, 0.44445],
+ 198: [0, 0.68333, 0, 0, 0.90278],
+ 215: [0.08333, 0.58333, 0, 0, 0.77778],
+ 216: [0.04861, 0.73194, 0, 0, 0.77778],
+ 223: [0, 0.69444, 0, 0, 0.5],
+ 230: [0, 0.43056, 0, 0, 0.72222],
+ 247: [0.08333, 0.58333, 0, 0, 0.77778],
+ 248: [0.09722, 0.52778, 0, 0, 0.5],
+ 305: [0, 0.43056, 0, 0, 0.27778],
+ 338: [0, 0.68333, 0, 0, 1.01389],
+ 339: [0, 0.43056, 0, 0, 0.77778],
+ 567: [0.19444, 0.43056, 0, 0, 0.30556],
+ 710: [0, 0.69444, 0, 0, 0.5],
+ 711: [0, 0.62847, 0, 0, 0.5],
+ 713: [0, 0.56778, 0, 0, 0.5],
+ 714: [0, 0.69444, 0, 0, 0.5],
+ 715: [0, 0.69444, 0, 0, 0.5],
+ 728: [0, 0.69444, 0, 0, 0.5],
+ 729: [0, 0.66786, 0, 0, 0.27778],
+ 730: [0, 0.69444, 0, 0, 0.75],
+ 732: [0, 0.66786, 0, 0, 0.5],
+ 733: [0, 0.69444, 0, 0, 0.5],
+ 915: [0, 0.68333, 0, 0, 0.625],
+ 916: [0, 0.68333, 0, 0, 0.83334],
+ 920: [0, 0.68333, 0, 0, 0.77778],
+ 923: [0, 0.68333, 0, 0, 0.69445],
+ 926: [0, 0.68333, 0, 0, 0.66667],
+ 928: [0, 0.68333, 0, 0, 0.75],
+ 931: [0, 0.68333, 0, 0, 0.72222],
+ 933: [0, 0.68333, 0, 0, 0.77778],
+ 934: [0, 0.68333, 0, 0, 0.72222],
+ 936: [0, 0.68333, 0, 0, 0.77778],
+ 937: [0, 0.68333, 0, 0, 0.72222],
+ 8211: [0, 0.43056, 0.02778, 0, 0.5],
+ 8212: [0, 0.43056, 0.02778, 0, 1],
+ 8216: [0, 0.69444, 0, 0, 0.27778],
+ 8217: [0, 0.69444, 0, 0, 0.27778],
+ 8220: [0, 0.69444, 0, 0, 0.5],
+ 8221: [0, 0.69444, 0, 0, 0.5],
+ 8224: [0.19444, 0.69444, 0, 0, 0.44445],
+ 8225: [0.19444, 0.69444, 0, 0, 0.44445],
+ 8230: [0, 0.123, 0, 0, 1.172],
+ 8242: [0, 0.55556, 0, 0, 0.275],
+ 8407: [0, 0.71444, 0.15382, 0, 0.5],
+ 8463: [0, 0.68889, 0, 0, 0.54028],
+ 8465: [0, 0.69444, 0, 0, 0.72222],
+ 8467: [0, 0.69444, 0, 0.11111, 0.41667],
+ 8472: [0.19444, 0.43056, 0, 0.11111, 0.63646],
+ 8476: [0, 0.69444, 0, 0, 0.72222],
+ 8501: [0, 0.69444, 0, 0, 0.61111],
+ 8592: [-0.13313, 0.36687, 0, 0, 1],
+ 8593: [0.19444, 0.69444, 0, 0, 0.5],
+ 8594: [-0.13313, 0.36687, 0, 0, 1],
+ 8595: [0.19444, 0.69444, 0, 0, 0.5],
+ 8596: [-0.13313, 0.36687, 0, 0, 1],
+ 8597: [0.25, 0.75, 0, 0, 0.5],
+ 8598: [0.19444, 0.69444, 0, 0, 1],
+ 8599: [0.19444, 0.69444, 0, 0, 1],
+ 8600: [0.19444, 0.69444, 0, 0, 1],
+ 8601: [0.19444, 0.69444, 0, 0, 1],
+ 8614: [0.011, 0.511, 0, 0, 1],
+ 8617: [0.011, 0.511, 0, 0, 1.126],
+ 8618: [0.011, 0.511, 0, 0, 1.126],
+ 8636: [-0.13313, 0.36687, 0, 0, 1],
+ 8637: [-0.13313, 0.36687, 0, 0, 1],
+ 8640: [-0.13313, 0.36687, 0, 0, 1],
+ 8641: [-0.13313, 0.36687, 0, 0, 1],
+ 8652: [0.011, 0.671, 0, 0, 1],
+ 8656: [-0.13313, 0.36687, 0, 0, 1],
+ 8657: [0.19444, 0.69444, 0, 0, 0.61111],
+ 8658: [-0.13313, 0.36687, 0, 0, 1],
+ 8659: [0.19444, 0.69444, 0, 0, 0.61111],
+ 8660: [-0.13313, 0.36687, 0, 0, 1],
+ 8661: [0.25, 0.75, 0, 0, 0.61111],
+ 8704: [0, 0.69444, 0, 0, 0.55556],
+ 8706: [0, 0.69444, 0.05556, 0.08334, 0.5309],
+ 8707: [0, 0.69444, 0, 0, 0.55556],
+ 8709: [0.05556, 0.75, 0, 0, 0.5],
+ 8711: [0, 0.68333, 0, 0, 0.83334],
+ 8712: [0.0391, 0.5391, 0, 0, 0.66667],
+ 8715: [0.0391, 0.5391, 0, 0, 0.66667],
+ 8722: [0.08333, 0.58333, 0, 0, 0.77778],
+ 8723: [0.08333, 0.58333, 0, 0, 0.77778],
+ 8725: [0.25, 0.75, 0, 0, 0.5],
+ 8726: [0.25, 0.75, 0, 0, 0.5],
+ 8727: [-0.03472, 0.46528, 0, 0, 0.5],
+ 8728: [-0.05555, 0.44445, 0, 0, 0.5],
+ 8729: [-0.05555, 0.44445, 0, 0, 0.5],
+ 8730: [0.2, 0.8, 0, 0, 0.83334],
+ 8733: [0, 0.43056, 0, 0, 0.77778],
+ 8734: [0, 0.43056, 0, 0, 1],
+ 8736: [0, 0.69224, 0, 0, 0.72222],
+ 8739: [0.25, 0.75, 0, 0, 0.27778],
+ 8741: [0.25, 0.75, 0, 0, 0.5],
+ 8743: [0, 0.55556, 0, 0, 0.66667],
+ 8744: [0, 0.55556, 0, 0, 0.66667],
+ 8745: [0, 0.55556, 0, 0, 0.66667],
+ 8746: [0, 0.55556, 0, 0, 0.66667],
+ 8747: [0.19444, 0.69444, 0.11111, 0, 0.41667],
+ 8764: [-0.13313, 0.36687, 0, 0, 0.77778],
+ 8768: [0.19444, 0.69444, 0, 0, 0.27778],
+ 8771: [-0.03625, 0.46375, 0, 0, 0.77778],
+ 8773: [-0.022, 0.589, 0, 0, 0.778],
+ 8776: [-0.01688, 0.48312, 0, 0, 0.77778],
+ 8781: [-0.03625, 0.46375, 0, 0, 0.77778],
+ 8784: [-0.133, 0.673, 0, 0, 0.778],
+ 8801: [-0.03625, 0.46375, 0, 0, 0.77778],
+ 8804: [0.13597, 0.63597, 0, 0, 0.77778],
+ 8805: [0.13597, 0.63597, 0, 0, 0.77778],
+ 8810: [0.0391, 0.5391, 0, 0, 1],
+ 8811: [0.0391, 0.5391, 0, 0, 1],
+ 8826: [0.0391, 0.5391, 0, 0, 0.77778],
+ 8827: [0.0391, 0.5391, 0, 0, 0.77778],
+ 8834: [0.0391, 0.5391, 0, 0, 0.77778],
+ 8835: [0.0391, 0.5391, 0, 0, 0.77778],
+ 8838: [0.13597, 0.63597, 0, 0, 0.77778],
+ 8839: [0.13597, 0.63597, 0, 0, 0.77778],
+ 8846: [0, 0.55556, 0, 0, 0.66667],
+ 8849: [0.13597, 0.63597, 0, 0, 0.77778],
+ 8850: [0.13597, 0.63597, 0, 0, 0.77778],
+ 8851: [0, 0.55556, 0, 0, 0.66667],
+ 8852: [0, 0.55556, 0, 0, 0.66667],
+ 8853: [0.08333, 0.58333, 0, 0, 0.77778],
+ 8854: [0.08333, 0.58333, 0, 0, 0.77778],
+ 8855: [0.08333, 0.58333, 0, 0, 0.77778],
+ 8856: [0.08333, 0.58333, 0, 0, 0.77778],
+ 8857: [0.08333, 0.58333, 0, 0, 0.77778],
+ 8866: [0, 0.69444, 0, 0, 0.61111],
+ 8867: [0, 0.69444, 0, 0, 0.61111],
+ 8868: [0, 0.69444, 0, 0, 0.77778],
+ 8869: [0, 0.69444, 0, 0, 0.77778],
+ 8872: [0.249, 0.75, 0, 0, 0.867],
+ 8900: [-0.05555, 0.44445, 0, 0, 0.5],
+ 8901: [-0.05555, 0.44445, 0, 0, 0.27778],
+ 8902: [-0.03472, 0.46528, 0, 0, 0.5],
+ 8904: [5e-3, 0.505, 0, 0, 0.9],
+ 8942: [0.03, 0.903, 0, 0, 0.278],
+ 8943: [-0.19, 0.313, 0, 0, 1.172],
+ 8945: [-0.1, 0.823, 0, 0, 1.282],
+ 8968: [0.25, 0.75, 0, 0, 0.44445],
+ 8969: [0.25, 0.75, 0, 0, 0.44445],
+ 8970: [0.25, 0.75, 0, 0, 0.44445],
+ 8971: [0.25, 0.75, 0, 0, 0.44445],
+ 8994: [-0.14236, 0.35764, 0, 0, 1],
+ 8995: [-0.14236, 0.35764, 0, 0, 1],
+ 9136: [0.244, 0.744, 0, 0, 0.412],
+ 9137: [0.244, 0.745, 0, 0, 0.412],
+ 9651: [0.19444, 0.69444, 0, 0, 0.88889],
+ 9657: [-0.03472, 0.46528, 0, 0, 0.5],
+ 9661: [0.19444, 0.69444, 0, 0, 0.88889],
+ 9667: [-0.03472, 0.46528, 0, 0, 0.5],
+ 9711: [0.19444, 0.69444, 0, 0, 1],
+ 9824: [0.12963, 0.69444, 0, 0, 0.77778],
+ 9825: [0.12963, 0.69444, 0, 0, 0.77778],
+ 9826: [0.12963, 0.69444, 0, 0, 0.77778],
+ 9827: [0.12963, 0.69444, 0, 0, 0.77778],
+ 9837: [0, 0.75, 0, 0, 0.38889],
+ 9838: [0.19444, 0.69444, 0, 0, 0.38889],
+ 9839: [0.19444, 0.69444, 0, 0, 0.38889],
+ 10216: [0.25, 0.75, 0, 0, 0.38889],
+ 10217: [0.25, 0.75, 0, 0, 0.38889],
+ 10222: [0.244, 0.744, 0, 0, 0.412],
+ 10223: [0.244, 0.745, 0, 0, 0.412],
+ 10229: [0.011, 0.511, 0, 0, 1.609],
+ 10230: [0.011, 0.511, 0, 0, 1.638],
+ 10231: [0.011, 0.511, 0, 0, 1.859],
+ 10232: [0.024, 0.525, 0, 0, 1.609],
+ 10233: [0.024, 0.525, 0, 0, 1.638],
+ 10234: [0.024, 0.525, 0, 0, 1.858],
+ 10236: [0.011, 0.511, 0, 0, 1.638],
+ 10815: [0, 0.68333, 0, 0, 0.75],
+ 10927: [0.13597, 0.63597, 0, 0, 0.77778],
+ 10928: [0.13597, 0.63597, 0, 0, 0.77778],
+ 57376: [0.19444, 0.69444, 0, 0, 0]
+ },
+ "Math-BoldItalic": {
+ 32: [0, 0, 0, 0, 0.25],
+ 48: [0, 0.44444, 0, 0, 0.575],
+ 49: [0, 0.44444, 0, 0, 0.575],
+ 50: [0, 0.44444, 0, 0, 0.575],
+ 51: [0.19444, 0.44444, 0, 0, 0.575],
+ 52: [0.19444, 0.44444, 0, 0, 0.575],
+ 53: [0.19444, 0.44444, 0, 0, 0.575],
+ 54: [0, 0.64444, 0, 0, 0.575],
+ 55: [0.19444, 0.44444, 0, 0, 0.575],
+ 56: [0, 0.64444, 0, 0, 0.575],
+ 57: [0.19444, 0.44444, 0, 0, 0.575],
+ 65: [0, 0.68611, 0, 0, 0.86944],
+ 66: [0, 0.68611, 0.04835, 0, 0.8664],
+ 67: [0, 0.68611, 0.06979, 0, 0.81694],
+ 68: [0, 0.68611, 0.03194, 0, 0.93812],
+ 69: [0, 0.68611, 0.05451, 0, 0.81007],
+ 70: [0, 0.68611, 0.15972, 0, 0.68889],
+ 71: [0, 0.68611, 0, 0, 0.88673],
+ 72: [0, 0.68611, 0.08229, 0, 0.98229],
+ 73: [0, 0.68611, 0.07778, 0, 0.51111],
+ 74: [0, 0.68611, 0.10069, 0, 0.63125],
+ 75: [0, 0.68611, 0.06979, 0, 0.97118],
+ 76: [0, 0.68611, 0, 0, 0.75555],
+ 77: [0, 0.68611, 0.11424, 0, 1.14201],
+ 78: [0, 0.68611, 0.11424, 0, 0.95034],
+ 79: [0, 0.68611, 0.03194, 0, 0.83666],
+ 80: [0, 0.68611, 0.15972, 0, 0.72309],
+ 81: [0.19444, 0.68611, 0, 0, 0.86861],
+ 82: [0, 0.68611, 421e-5, 0, 0.87235],
+ 83: [0, 0.68611, 0.05382, 0, 0.69271],
+ 84: [0, 0.68611, 0.15972, 0, 0.63663],
+ 85: [0, 0.68611, 0.11424, 0, 0.80027],
+ 86: [0, 0.68611, 0.25555, 0, 0.67778],
+ 87: [0, 0.68611, 0.15972, 0, 1.09305],
+ 88: [0, 0.68611, 0.07778, 0, 0.94722],
+ 89: [0, 0.68611, 0.25555, 0, 0.67458],
+ 90: [0, 0.68611, 0.06979, 0, 0.77257],
+ 97: [0, 0.44444, 0, 0, 0.63287],
+ 98: [0, 0.69444, 0, 0, 0.52083],
+ 99: [0, 0.44444, 0, 0, 0.51342],
+ 100: [0, 0.69444, 0, 0, 0.60972],
+ 101: [0, 0.44444, 0, 0, 0.55361],
+ 102: [0.19444, 0.69444, 0.11042, 0, 0.56806],
+ 103: [0.19444, 0.44444, 0.03704, 0, 0.5449],
+ 104: [0, 0.69444, 0, 0, 0.66759],
+ 105: [0, 0.69326, 0, 0, 0.4048],
+ 106: [0.19444, 0.69326, 0.0622, 0, 0.47083],
+ 107: [0, 0.69444, 0.01852, 0, 0.6037],
+ 108: [0, 0.69444, 88e-4, 0, 0.34815],
+ 109: [0, 0.44444, 0, 0, 1.0324],
+ 110: [0, 0.44444, 0, 0, 0.71296],
+ 111: [0, 0.44444, 0, 0, 0.58472],
+ 112: [0.19444, 0.44444, 0, 0, 0.60092],
+ 113: [0.19444, 0.44444, 0.03704, 0, 0.54213],
+ 114: [0, 0.44444, 0.03194, 0, 0.5287],
+ 115: [0, 0.44444, 0, 0, 0.53125],
+ 116: [0, 0.63492, 0, 0, 0.41528],
+ 117: [0, 0.44444, 0, 0, 0.68102],
+ 118: [0, 0.44444, 0.03704, 0, 0.56666],
+ 119: [0, 0.44444, 0.02778, 0, 0.83148],
+ 120: [0, 0.44444, 0, 0, 0.65903],
+ 121: [0.19444, 0.44444, 0.03704, 0, 0.59028],
+ 122: [0, 0.44444, 0.04213, 0, 0.55509],
+ 160: [0, 0, 0, 0, 0.25],
+ 915: [0, 0.68611, 0.15972, 0, 0.65694],
+ 916: [0, 0.68611, 0, 0, 0.95833],
+ 920: [0, 0.68611, 0.03194, 0, 0.86722],
+ 923: [0, 0.68611, 0, 0, 0.80555],
+ 926: [0, 0.68611, 0.07458, 0, 0.84125],
+ 928: [0, 0.68611, 0.08229, 0, 0.98229],
+ 931: [0, 0.68611, 0.05451, 0, 0.88507],
+ 933: [0, 0.68611, 0.15972, 0, 0.67083],
+ 934: [0, 0.68611, 0, 0, 0.76666],
+ 936: [0, 0.68611, 0.11653, 0, 0.71402],
+ 937: [0, 0.68611, 0.04835, 0, 0.8789],
+ 945: [0, 0.44444, 0, 0, 0.76064],
+ 946: [0.19444, 0.69444, 0.03403, 0, 0.65972],
+ 947: [0.19444, 0.44444, 0.06389, 0, 0.59003],
+ 948: [0, 0.69444, 0.03819, 0, 0.52222],
+ 949: [0, 0.44444, 0, 0, 0.52882],
+ 950: [0.19444, 0.69444, 0.06215, 0, 0.50833],
+ 951: [0.19444, 0.44444, 0.03704, 0, 0.6],
+ 952: [0, 0.69444, 0.03194, 0, 0.5618],
+ 953: [0, 0.44444, 0, 0, 0.41204],
+ 954: [0, 0.44444, 0, 0, 0.66759],
+ 955: [0, 0.69444, 0, 0, 0.67083],
+ 956: [0.19444, 0.44444, 0, 0, 0.70787],
+ 957: [0, 0.44444, 0.06898, 0, 0.57685],
+ 958: [0.19444, 0.69444, 0.03021, 0, 0.50833],
+ 959: [0, 0.44444, 0, 0, 0.58472],
+ 960: [0, 0.44444, 0.03704, 0, 0.68241],
+ 961: [0.19444, 0.44444, 0, 0, 0.6118],
+ 962: [0.09722, 0.44444, 0.07917, 0, 0.42361],
+ 963: [0, 0.44444, 0.03704, 0, 0.68588],
+ 964: [0, 0.44444, 0.13472, 0, 0.52083],
+ 965: [0, 0.44444, 0.03704, 0, 0.63055],
+ 966: [0.19444, 0.44444, 0, 0, 0.74722],
+ 967: [0.19444, 0.44444, 0, 0, 0.71805],
+ 968: [0.19444, 0.69444, 0.03704, 0, 0.75833],
+ 969: [0, 0.44444, 0.03704, 0, 0.71782],
+ 977: [0, 0.69444, 0, 0, 0.69155],
+ 981: [0.19444, 0.69444, 0, 0, 0.7125],
+ 982: [0, 0.44444, 0.03194, 0, 0.975],
+ 1009: [0.19444, 0.44444, 0, 0, 0.6118],
+ 1013: [0, 0.44444, 0, 0, 0.48333],
+ 57649: [0, 0.44444, 0, 0, 0.39352],
+ 57911: [0.19444, 0.44444, 0, 0, 0.43889]
+ },
+ "Math-Italic": {
+ 32: [0, 0, 0, 0, 0.25],
+ 48: [0, 0.43056, 0, 0, 0.5],
+ 49: [0, 0.43056, 0, 0, 0.5],
+ 50: [0, 0.43056, 0, 0, 0.5],
+ 51: [0.19444, 0.43056, 0, 0, 0.5],
+ 52: [0.19444, 0.43056, 0, 0, 0.5],
+ 53: [0.19444, 0.43056, 0, 0, 0.5],
+ 54: [0, 0.64444, 0, 0, 0.5],
+ 55: [0.19444, 0.43056, 0, 0, 0.5],
+ 56: [0, 0.64444, 0, 0, 0.5],
+ 57: [0.19444, 0.43056, 0, 0, 0.5],
+ 65: [0, 0.68333, 0, 0.13889, 0.75],
+ 66: [0, 0.68333, 0.05017, 0.08334, 0.75851],
+ 67: [0, 0.68333, 0.07153, 0.08334, 0.71472],
+ 68: [0, 0.68333, 0.02778, 0.05556, 0.82792],
+ 69: [0, 0.68333, 0.05764, 0.08334, 0.7382],
+ 70: [0, 0.68333, 0.13889, 0.08334, 0.64306],
+ 71: [0, 0.68333, 0, 0.08334, 0.78625],
+ 72: [0, 0.68333, 0.08125, 0.05556, 0.83125],
+ 73: [0, 0.68333, 0.07847, 0.11111, 0.43958],
+ 74: [0, 0.68333, 0.09618, 0.16667, 0.55451],
+ 75: [0, 0.68333, 0.07153, 0.05556, 0.84931],
+ 76: [0, 0.68333, 0, 0.02778, 0.68056],
+ 77: [0, 0.68333, 0.10903, 0.08334, 0.97014],
+ 78: [0, 0.68333, 0.10903, 0.08334, 0.80347],
+ 79: [0, 0.68333, 0.02778, 0.08334, 0.76278],
+ 80: [0, 0.68333, 0.13889, 0.08334, 0.64201],
+ 81: [0.19444, 0.68333, 0, 0.08334, 0.79056],
+ 82: [0, 0.68333, 773e-5, 0.08334, 0.75929],
+ 83: [0, 0.68333, 0.05764, 0.08334, 0.6132],
+ 84: [0, 0.68333, 0.13889, 0.08334, 0.58438],
+ 85: [0, 0.68333, 0.10903, 0.02778, 0.68278],
+ 86: [0, 0.68333, 0.22222, 0, 0.58333],
+ 87: [0, 0.68333, 0.13889, 0, 0.94445],
+ 88: [0, 0.68333, 0.07847, 0.08334, 0.82847],
+ 89: [0, 0.68333, 0.22222, 0, 0.58056],
+ 90: [0, 0.68333, 0.07153, 0.08334, 0.68264],
+ 97: [0, 0.43056, 0, 0, 0.52859],
+ 98: [0, 0.69444, 0, 0, 0.42917],
+ 99: [0, 0.43056, 0, 0.05556, 0.43276],
+ 100: [0, 0.69444, 0, 0.16667, 0.52049],
+ 101: [0, 0.43056, 0, 0.05556, 0.46563],
+ 102: [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],
+ 103: [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],
+ 104: [0, 0.69444, 0, 0, 0.57616],
+ 105: [0, 0.65952, 0, 0, 0.34451],
+ 106: [0.19444, 0.65952, 0.05724, 0, 0.41181],
+ 107: [0, 0.69444, 0.03148, 0, 0.5206],
+ 108: [0, 0.69444, 0.01968, 0.08334, 0.29838],
+ 109: [0, 0.43056, 0, 0, 0.87801],
+ 110: [0, 0.43056, 0, 0, 0.60023],
+ 111: [0, 0.43056, 0, 0.05556, 0.48472],
+ 112: [0.19444, 0.43056, 0, 0.08334, 0.50313],
+ 113: [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],
+ 114: [0, 0.43056, 0.02778, 0.05556, 0.45116],
+ 115: [0, 0.43056, 0, 0.05556, 0.46875],
+ 116: [0, 0.61508, 0, 0.08334, 0.36111],
+ 117: [0, 0.43056, 0, 0.02778, 0.57246],
+ 118: [0, 0.43056, 0.03588, 0.02778, 0.48472],
+ 119: [0, 0.43056, 0.02691, 0.08334, 0.71592],
+ 120: [0, 0.43056, 0, 0.02778, 0.57153],
+ 121: [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],
+ 122: [0, 0.43056, 0.04398, 0.05556, 0.46505],
+ 160: [0, 0, 0, 0, 0.25],
+ 915: [0, 0.68333, 0.13889, 0.08334, 0.61528],
+ 916: [0, 0.68333, 0, 0.16667, 0.83334],
+ 920: [0, 0.68333, 0.02778, 0.08334, 0.76278],
+ 923: [0, 0.68333, 0, 0.16667, 0.69445],
+ 926: [0, 0.68333, 0.07569, 0.08334, 0.74236],
+ 928: [0, 0.68333, 0.08125, 0.05556, 0.83125],
+ 931: [0, 0.68333, 0.05764, 0.08334, 0.77986],
+ 933: [0, 0.68333, 0.13889, 0.05556, 0.58333],
+ 934: [0, 0.68333, 0, 0.08334, 0.66667],
+ 936: [0, 0.68333, 0.11, 0.05556, 0.61222],
+ 937: [0, 0.68333, 0.05017, 0.08334, 0.7724],
+ 945: [0, 0.43056, 37e-4, 0.02778, 0.6397],
+ 946: [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],
+ 947: [0.19444, 0.43056, 0.05556, 0, 0.51773],
+ 948: [0, 0.69444, 0.03785, 0.05556, 0.44444],
+ 949: [0, 0.43056, 0, 0.08334, 0.46632],
+ 950: [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],
+ 951: [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],
+ 952: [0, 0.69444, 0.02778, 0.08334, 0.46944],
+ 953: [0, 0.43056, 0, 0.05556, 0.35394],
+ 954: [0, 0.43056, 0, 0, 0.57616],
+ 955: [0, 0.69444, 0, 0, 0.58334],
+ 956: [0.19444, 0.43056, 0, 0.02778, 0.60255],
+ 957: [0, 0.43056, 0.06366, 0.02778, 0.49398],
+ 958: [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],
+ 959: [0, 0.43056, 0, 0.05556, 0.48472],
+ 960: [0, 0.43056, 0.03588, 0, 0.57003],
+ 961: [0.19444, 0.43056, 0, 0.08334, 0.51702],
+ 962: [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],
+ 963: [0, 0.43056, 0.03588, 0, 0.57141],
+ 964: [0, 0.43056, 0.1132, 0.02778, 0.43715],
+ 965: [0, 0.43056, 0.03588, 0.02778, 0.54028],
+ 966: [0.19444, 0.43056, 0, 0.08334, 0.65417],
+ 967: [0.19444, 0.43056, 0, 0.05556, 0.62569],
+ 968: [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],
+ 969: [0, 0.43056, 0.03588, 0, 0.62245],
+ 977: [0, 0.69444, 0, 0.08334, 0.59144],
+ 981: [0.19444, 0.69444, 0, 0.08334, 0.59583],
+ 982: [0, 0.43056, 0.02778, 0, 0.82813],
+ 1009: [0.19444, 0.43056, 0, 0.08334, 0.51702],
+ 1013: [0, 0.43056, 0, 0.05556, 0.4059],
+ 57649: [0, 0.43056, 0, 0.02778, 0.32246],
+ 57911: [0.19444, 0.43056, 0, 0.08334, 0.38403]
+ },
+ "SansSerif-Bold": {
+ 32: [0, 0, 0, 0, 0.25],
+ 33: [0, 0.69444, 0, 0, 0.36667],
+ 34: [0, 0.69444, 0, 0, 0.55834],
+ 35: [0.19444, 0.69444, 0, 0, 0.91667],
+ 36: [0.05556, 0.75, 0, 0, 0.55],
+ 37: [0.05556, 0.75, 0, 0, 1.02912],
+ 38: [0, 0.69444, 0, 0, 0.83056],
+ 39: [0, 0.69444, 0, 0, 0.30556],
+ 40: [0.25, 0.75, 0, 0, 0.42778],
+ 41: [0.25, 0.75, 0, 0, 0.42778],
+ 42: [0, 0.75, 0, 0, 0.55],
+ 43: [0.11667, 0.61667, 0, 0, 0.85556],
+ 44: [0.10556, 0.13056, 0, 0, 0.30556],
+ 45: [0, 0.45833, 0, 0, 0.36667],
+ 46: [0, 0.13056, 0, 0, 0.30556],
+ 47: [0.25, 0.75, 0, 0, 0.55],
+ 48: [0, 0.69444, 0, 0, 0.55],
+ 49: [0, 0.69444, 0, 0, 0.55],
+ 50: [0, 0.69444, 0, 0, 0.55],
+ 51: [0, 0.69444, 0, 0, 0.55],
+ 52: [0, 0.69444, 0, 0, 0.55],
+ 53: [0, 0.69444, 0, 0, 0.55],
+ 54: [0, 0.69444, 0, 0, 0.55],
+ 55: [0, 0.69444, 0, 0, 0.55],
+ 56: [0, 0.69444, 0, 0, 0.55],
+ 57: [0, 0.69444, 0, 0, 0.55],
+ 58: [0, 0.45833, 0, 0, 0.30556],
+ 59: [0.10556, 0.45833, 0, 0, 0.30556],
+ 61: [-0.09375, 0.40625, 0, 0, 0.85556],
+ 63: [0, 0.69444, 0, 0, 0.51945],
+ 64: [0, 0.69444, 0, 0, 0.73334],
+ 65: [0, 0.69444, 0, 0, 0.73334],
+ 66: [0, 0.69444, 0, 0, 0.73334],
+ 67: [0, 0.69444, 0, 0, 0.70278],
+ 68: [0, 0.69444, 0, 0, 0.79445],
+ 69: [0, 0.69444, 0, 0, 0.64167],
+ 70: [0, 0.69444, 0, 0, 0.61111],
+ 71: [0, 0.69444, 0, 0, 0.73334],
+ 72: [0, 0.69444, 0, 0, 0.79445],
+ 73: [0, 0.69444, 0, 0, 0.33056],
+ 74: [0, 0.69444, 0, 0, 0.51945],
+ 75: [0, 0.69444, 0, 0, 0.76389],
+ 76: [0, 0.69444, 0, 0, 0.58056],
+ 77: [0, 0.69444, 0, 0, 0.97778],
+ 78: [0, 0.69444, 0, 0, 0.79445],
+ 79: [0, 0.69444, 0, 0, 0.79445],
+ 80: [0, 0.69444, 0, 0, 0.70278],
+ 81: [0.10556, 0.69444, 0, 0, 0.79445],
+ 82: [0, 0.69444, 0, 0, 0.70278],
+ 83: [0, 0.69444, 0, 0, 0.61111],
+ 84: [0, 0.69444, 0, 0, 0.73334],
+ 85: [0, 0.69444, 0, 0, 0.76389],
+ 86: [0, 0.69444, 0.01528, 0, 0.73334],
+ 87: [0, 0.69444, 0.01528, 0, 1.03889],
+ 88: [0, 0.69444, 0, 0, 0.73334],
+ 89: [0, 0.69444, 0.0275, 0, 0.73334],
+ 90: [0, 0.69444, 0, 0, 0.67223],
+ 91: [0.25, 0.75, 0, 0, 0.34306],
+ 93: [0.25, 0.75, 0, 0, 0.34306],
+ 94: [0, 0.69444, 0, 0, 0.55],
+ 95: [0.35, 0.10833, 0.03056, 0, 0.55],
+ 97: [0, 0.45833, 0, 0, 0.525],
+ 98: [0, 0.69444, 0, 0, 0.56111],
+ 99: [0, 0.45833, 0, 0, 0.48889],
+ 100: [0, 0.69444, 0, 0, 0.56111],
+ 101: [0, 0.45833, 0, 0, 0.51111],
+ 102: [0, 0.69444, 0.07639, 0, 0.33611],
+ 103: [0.19444, 0.45833, 0.01528, 0, 0.55],
+ 104: [0, 0.69444, 0, 0, 0.56111],
+ 105: [0, 0.69444, 0, 0, 0.25556],
+ 106: [0.19444, 0.69444, 0, 0, 0.28611],
+ 107: [0, 0.69444, 0, 0, 0.53056],
+ 108: [0, 0.69444, 0, 0, 0.25556],
+ 109: [0, 0.45833, 0, 0, 0.86667],
+ 110: [0, 0.45833, 0, 0, 0.56111],
+ 111: [0, 0.45833, 0, 0, 0.55],
+ 112: [0.19444, 0.45833, 0, 0, 0.56111],
+ 113: [0.19444, 0.45833, 0, 0, 0.56111],
+ 114: [0, 0.45833, 0.01528, 0, 0.37222],
+ 115: [0, 0.45833, 0, 0, 0.42167],
+ 116: [0, 0.58929, 0, 0, 0.40417],
+ 117: [0, 0.45833, 0, 0, 0.56111],
+ 118: [0, 0.45833, 0.01528, 0, 0.5],
+ 119: [0, 0.45833, 0.01528, 0, 0.74445],
+ 120: [0, 0.45833, 0, 0, 0.5],
+ 121: [0.19444, 0.45833, 0.01528, 0, 0.5],
+ 122: [0, 0.45833, 0, 0, 0.47639],
+ 126: [0.35, 0.34444, 0, 0, 0.55],
+ 160: [0, 0, 0, 0, 0.25],
+ 168: [0, 0.69444, 0, 0, 0.55],
+ 176: [0, 0.69444, 0, 0, 0.73334],
+ 180: [0, 0.69444, 0, 0, 0.55],
+ 184: [0.17014, 0, 0, 0, 0.48889],
+ 305: [0, 0.45833, 0, 0, 0.25556],
+ 567: [0.19444, 0.45833, 0, 0, 0.28611],
+ 710: [0, 0.69444, 0, 0, 0.55],
+ 711: [0, 0.63542, 0, 0, 0.55],
+ 713: [0, 0.63778, 0, 0, 0.55],
+ 728: [0, 0.69444, 0, 0, 0.55],
+ 729: [0, 0.69444, 0, 0, 0.30556],
+ 730: [0, 0.69444, 0, 0, 0.73334],
+ 732: [0, 0.69444, 0, 0, 0.55],
+ 733: [0, 0.69444, 0, 0, 0.55],
+ 915: [0, 0.69444, 0, 0, 0.58056],
+ 916: [0, 0.69444, 0, 0, 0.91667],
+ 920: [0, 0.69444, 0, 0, 0.85556],
+ 923: [0, 0.69444, 0, 0, 0.67223],
+ 926: [0, 0.69444, 0, 0, 0.73334],
+ 928: [0, 0.69444, 0, 0, 0.79445],
+ 931: [0, 0.69444, 0, 0, 0.79445],
+ 933: [0, 0.69444, 0, 0, 0.85556],
+ 934: [0, 0.69444, 0, 0, 0.79445],
+ 936: [0, 0.69444, 0, 0, 0.85556],
+ 937: [0, 0.69444, 0, 0, 0.79445],
+ 8211: [0, 0.45833, 0.03056, 0, 0.55],
+ 8212: [0, 0.45833, 0.03056, 0, 1.10001],
+ 8216: [0, 0.69444, 0, 0, 0.30556],
+ 8217: [0, 0.69444, 0, 0, 0.30556],
+ 8220: [0, 0.69444, 0, 0, 0.55834],
+ 8221: [0, 0.69444, 0, 0, 0.55834]
+ },
+ "SansSerif-Italic": {
+ 32: [0, 0, 0, 0, 0.25],
+ 33: [0, 0.69444, 0.05733, 0, 0.31945],
+ 34: [0, 0.69444, 316e-5, 0, 0.5],
+ 35: [0.19444, 0.69444, 0.05087, 0, 0.83334],
+ 36: [0.05556, 0.75, 0.11156, 0, 0.5],
+ 37: [0.05556, 0.75, 0.03126, 0, 0.83334],
+ 38: [0, 0.69444, 0.03058, 0, 0.75834],
+ 39: [0, 0.69444, 0.07816, 0, 0.27778],
+ 40: [0.25, 0.75, 0.13164, 0, 0.38889],
+ 41: [0.25, 0.75, 0.02536, 0, 0.38889],
+ 42: [0, 0.75, 0.11775, 0, 0.5],
+ 43: [0.08333, 0.58333, 0.02536, 0, 0.77778],
+ 44: [0.125, 0.08333, 0, 0, 0.27778],
+ 45: [0, 0.44444, 0.01946, 0, 0.33333],
+ 46: [0, 0.08333, 0, 0, 0.27778],
+ 47: [0.25, 0.75, 0.13164, 0, 0.5],
+ 48: [0, 0.65556, 0.11156, 0, 0.5],
+ 49: [0, 0.65556, 0.11156, 0, 0.5],
+ 50: [0, 0.65556, 0.11156, 0, 0.5],
+ 51: [0, 0.65556, 0.11156, 0, 0.5],
+ 52: [0, 0.65556, 0.11156, 0, 0.5],
+ 53: [0, 0.65556, 0.11156, 0, 0.5],
+ 54: [0, 0.65556, 0.11156, 0, 0.5],
+ 55: [0, 0.65556, 0.11156, 0, 0.5],
+ 56: [0, 0.65556, 0.11156, 0, 0.5],
+ 57: [0, 0.65556, 0.11156, 0, 0.5],
+ 58: [0, 0.44444, 0.02502, 0, 0.27778],
+ 59: [0.125, 0.44444, 0.02502, 0, 0.27778],
+ 61: [-0.13, 0.37, 0.05087, 0, 0.77778],
+ 63: [0, 0.69444, 0.11809, 0, 0.47222],
+ 64: [0, 0.69444, 0.07555, 0, 0.66667],
+ 65: [0, 0.69444, 0, 0, 0.66667],
+ 66: [0, 0.69444, 0.08293, 0, 0.66667],
+ 67: [0, 0.69444, 0.11983, 0, 0.63889],
+ 68: [0, 0.69444, 0.07555, 0, 0.72223],
+ 69: [0, 0.69444, 0.11983, 0, 0.59722],
+ 70: [0, 0.69444, 0.13372, 0, 0.56945],
+ 71: [0, 0.69444, 0.11983, 0, 0.66667],
+ 72: [0, 0.69444, 0.08094, 0, 0.70834],
+ 73: [0, 0.69444, 0.13372, 0, 0.27778],
+ 74: [0, 0.69444, 0.08094, 0, 0.47222],
+ 75: [0, 0.69444, 0.11983, 0, 0.69445],
+ 76: [0, 0.69444, 0, 0, 0.54167],
+ 77: [0, 0.69444, 0.08094, 0, 0.875],
+ 78: [0, 0.69444, 0.08094, 0, 0.70834],
+ 79: [0, 0.69444, 0.07555, 0, 0.73611],
+ 80: [0, 0.69444, 0.08293, 0, 0.63889],
+ 81: [0.125, 0.69444, 0.07555, 0, 0.73611],
+ 82: [0, 0.69444, 0.08293, 0, 0.64584],
+ 83: [0, 0.69444, 0.09205, 0, 0.55556],
+ 84: [0, 0.69444, 0.13372, 0, 0.68056],
+ 85: [0, 0.69444, 0.08094, 0, 0.6875],
+ 86: [0, 0.69444, 0.1615, 0, 0.66667],
+ 87: [0, 0.69444, 0.1615, 0, 0.94445],
+ 88: [0, 0.69444, 0.13372, 0, 0.66667],
+ 89: [0, 0.69444, 0.17261, 0, 0.66667],
+ 90: [0, 0.69444, 0.11983, 0, 0.61111],
+ 91: [0.25, 0.75, 0.15942, 0, 0.28889],
+ 93: [0.25, 0.75, 0.08719, 0, 0.28889],
+ 94: [0, 0.69444, 0.0799, 0, 0.5],
+ 95: [0.35, 0.09444, 0.08616, 0, 0.5],
+ 97: [0, 0.44444, 981e-5, 0, 0.48056],
+ 98: [0, 0.69444, 0.03057, 0, 0.51667],
+ 99: [0, 0.44444, 0.08336, 0, 0.44445],
+ 100: [0, 0.69444, 0.09483, 0, 0.51667],
+ 101: [0, 0.44444, 0.06778, 0, 0.44445],
+ 102: [0, 0.69444, 0.21705, 0, 0.30556],
+ 103: [0.19444, 0.44444, 0.10836, 0, 0.5],
+ 104: [0, 0.69444, 0.01778, 0, 0.51667],
+ 105: [0, 0.67937, 0.09718, 0, 0.23889],
+ 106: [0.19444, 0.67937, 0.09162, 0, 0.26667],
+ 107: [0, 0.69444, 0.08336, 0, 0.48889],
+ 108: [0, 0.69444, 0.09483, 0, 0.23889],
+ 109: [0, 0.44444, 0.01778, 0, 0.79445],
+ 110: [0, 0.44444, 0.01778, 0, 0.51667],
+ 111: [0, 0.44444, 0.06613, 0, 0.5],
+ 112: [0.19444, 0.44444, 0.0389, 0, 0.51667],
+ 113: [0.19444, 0.44444, 0.04169, 0, 0.51667],
+ 114: [0, 0.44444, 0.10836, 0, 0.34167],
+ 115: [0, 0.44444, 0.0778, 0, 0.38333],
+ 116: [0, 0.57143, 0.07225, 0, 0.36111],
+ 117: [0, 0.44444, 0.04169, 0, 0.51667],
+ 118: [0, 0.44444, 0.10836, 0, 0.46111],
+ 119: [0, 0.44444, 0.10836, 0, 0.68334],
+ 120: [0, 0.44444, 0.09169, 0, 0.46111],
+ 121: [0.19444, 0.44444, 0.10836, 0, 0.46111],
+ 122: [0, 0.44444, 0.08752, 0, 0.43472],
+ 126: [0.35, 0.32659, 0.08826, 0, 0.5],
+ 160: [0, 0, 0, 0, 0.25],
+ 168: [0, 0.67937, 0.06385, 0, 0.5],
+ 176: [0, 0.69444, 0, 0, 0.73752],
+ 184: [0.17014, 0, 0, 0, 0.44445],
+ 305: [0, 0.44444, 0.04169, 0, 0.23889],
+ 567: [0.19444, 0.44444, 0.04169, 0, 0.26667],
+ 710: [0, 0.69444, 0.0799, 0, 0.5],
+ 711: [0, 0.63194, 0.08432, 0, 0.5],
+ 713: [0, 0.60889, 0.08776, 0, 0.5],
+ 714: [0, 0.69444, 0.09205, 0, 0.5],
+ 715: [0, 0.69444, 0, 0, 0.5],
+ 728: [0, 0.69444, 0.09483, 0, 0.5],
+ 729: [0, 0.67937, 0.07774, 0, 0.27778],
+ 730: [0, 0.69444, 0, 0, 0.73752],
+ 732: [0, 0.67659, 0.08826, 0, 0.5],
+ 733: [0, 0.69444, 0.09205, 0, 0.5],
+ 915: [0, 0.69444, 0.13372, 0, 0.54167],
+ 916: [0, 0.69444, 0, 0, 0.83334],
+ 920: [0, 0.69444, 0.07555, 0, 0.77778],
+ 923: [0, 0.69444, 0, 0, 0.61111],
+ 926: [0, 0.69444, 0.12816, 0, 0.66667],
+ 928: [0, 0.69444, 0.08094, 0, 0.70834],
+ 931: [0, 0.69444, 0.11983, 0, 0.72222],
+ 933: [0, 0.69444, 0.09031, 0, 0.77778],
+ 934: [0, 0.69444, 0.04603, 0, 0.72222],
+ 936: [0, 0.69444, 0.09031, 0, 0.77778],
+ 937: [0, 0.69444, 0.08293, 0, 0.72222],
+ 8211: [0, 0.44444, 0.08616, 0, 0.5],
+ 8212: [0, 0.44444, 0.08616, 0, 1],
+ 8216: [0, 0.69444, 0.07816, 0, 0.27778],
+ 8217: [0, 0.69444, 0.07816, 0, 0.27778],
+ 8220: [0, 0.69444, 0.14205, 0, 0.5],
+ 8221: [0, 0.69444, 316e-5, 0, 0.5]
+ },
+ "SansSerif-Regular": {
+ 32: [0, 0, 0, 0, 0.25],
+ 33: [0, 0.69444, 0, 0, 0.31945],
+ 34: [0, 0.69444, 0, 0, 0.5],
+ 35: [0.19444, 0.69444, 0, 0, 0.83334],
+ 36: [0.05556, 0.75, 0, 0, 0.5],
+ 37: [0.05556, 0.75, 0, 0, 0.83334],
+ 38: [0, 0.69444, 0, 0, 0.75834],
+ 39: [0, 0.69444, 0, 0, 0.27778],
+ 40: [0.25, 0.75, 0, 0, 0.38889],
+ 41: [0.25, 0.75, 0, 0, 0.38889],
+ 42: [0, 0.75, 0, 0, 0.5],
+ 43: [0.08333, 0.58333, 0, 0, 0.77778],
+ 44: [0.125, 0.08333, 0, 0, 0.27778],
+ 45: [0, 0.44444, 0, 0, 0.33333],
+ 46: [0, 0.08333, 0, 0, 0.27778],
+ 47: [0.25, 0.75, 0, 0, 0.5],
+ 48: [0, 0.65556, 0, 0, 0.5],
+ 49: [0, 0.65556, 0, 0, 0.5],
+ 50: [0, 0.65556, 0, 0, 0.5],
+ 51: [0, 0.65556, 0, 0, 0.5],
+ 52: [0, 0.65556, 0, 0, 0.5],
+ 53: [0, 0.65556, 0, 0, 0.5],
+ 54: [0, 0.65556, 0, 0, 0.5],
+ 55: [0, 0.65556, 0, 0, 0.5],
+ 56: [0, 0.65556, 0, 0, 0.5],
+ 57: [0, 0.65556, 0, 0, 0.5],
+ 58: [0, 0.44444, 0, 0, 0.27778],
+ 59: [0.125, 0.44444, 0, 0, 0.27778],
+ 61: [-0.13, 0.37, 0, 0, 0.77778],
+ 63: [0, 0.69444, 0, 0, 0.47222],
+ 64: [0, 0.69444, 0, 0, 0.66667],
+ 65: [0, 0.69444, 0, 0, 0.66667],
+ 66: [0, 0.69444, 0, 0, 0.66667],
+ 67: [0, 0.69444, 0, 0, 0.63889],
+ 68: [0, 0.69444, 0, 0, 0.72223],
+ 69: [0, 0.69444, 0, 0, 0.59722],
+ 70: [0, 0.69444, 0, 0, 0.56945],
+ 71: [0, 0.69444, 0, 0, 0.66667],
+ 72: [0, 0.69444, 0, 0, 0.70834],
+ 73: [0, 0.69444, 0, 0, 0.27778],
+ 74: [0, 0.69444, 0, 0, 0.47222],
+ 75: [0, 0.69444, 0, 0, 0.69445],
+ 76: [0, 0.69444, 0, 0, 0.54167],
+ 77: [0, 0.69444, 0, 0, 0.875],
+ 78: [0, 0.69444, 0, 0, 0.70834],
+ 79: [0, 0.69444, 0, 0, 0.73611],
+ 80: [0, 0.69444, 0, 0, 0.63889],
+ 81: [0.125, 0.69444, 0, 0, 0.73611],
+ 82: [0, 0.69444, 0, 0, 0.64584],
+ 83: [0, 0.69444, 0, 0, 0.55556],
+ 84: [0, 0.69444, 0, 0, 0.68056],
+ 85: [0, 0.69444, 0, 0, 0.6875],
+ 86: [0, 0.69444, 0.01389, 0, 0.66667],
+ 87: [0, 0.69444, 0.01389, 0, 0.94445],
+ 88: [0, 0.69444, 0, 0, 0.66667],
+ 89: [0, 0.69444, 0.025, 0, 0.66667],
+ 90: [0, 0.69444, 0, 0, 0.61111],
+ 91: [0.25, 0.75, 0, 0, 0.28889],
+ 93: [0.25, 0.75, 0, 0, 0.28889],
+ 94: [0, 0.69444, 0, 0, 0.5],
+ 95: [0.35, 0.09444, 0.02778, 0, 0.5],
+ 97: [0, 0.44444, 0, 0, 0.48056],
+ 98: [0, 0.69444, 0, 0, 0.51667],
+ 99: [0, 0.44444, 0, 0, 0.44445],
+ 100: [0, 0.69444, 0, 0, 0.51667],
+ 101: [0, 0.44444, 0, 0, 0.44445],
+ 102: [0, 0.69444, 0.06944, 0, 0.30556],
+ 103: [0.19444, 0.44444, 0.01389, 0, 0.5],
+ 104: [0, 0.69444, 0, 0, 0.51667],
+ 105: [0, 0.67937, 0, 0, 0.23889],
+ 106: [0.19444, 0.67937, 0, 0, 0.26667],
+ 107: [0, 0.69444, 0, 0, 0.48889],
+ 108: [0, 0.69444, 0, 0, 0.23889],
+ 109: [0, 0.44444, 0, 0, 0.79445],
+ 110: [0, 0.44444, 0, 0, 0.51667],
+ 111: [0, 0.44444, 0, 0, 0.5],
+ 112: [0.19444, 0.44444, 0, 0, 0.51667],
+ 113: [0.19444, 0.44444, 0, 0, 0.51667],
+ 114: [0, 0.44444, 0.01389, 0, 0.34167],
+ 115: [0, 0.44444, 0, 0, 0.38333],
+ 116: [0, 0.57143, 0, 0, 0.36111],
+ 117: [0, 0.44444, 0, 0, 0.51667],
+ 118: [0, 0.44444, 0.01389, 0, 0.46111],
+ 119: [0, 0.44444, 0.01389, 0, 0.68334],
+ 120: [0, 0.44444, 0, 0, 0.46111],
+ 121: [0.19444, 0.44444, 0.01389, 0, 0.46111],
+ 122: [0, 0.44444, 0, 0, 0.43472],
+ 126: [0.35, 0.32659, 0, 0, 0.5],
+ 160: [0, 0, 0, 0, 0.25],
+ 168: [0, 0.67937, 0, 0, 0.5],
+ 176: [0, 0.69444, 0, 0, 0.66667],
+ 184: [0.17014, 0, 0, 0, 0.44445],
+ 305: [0, 0.44444, 0, 0, 0.23889],
+ 567: [0.19444, 0.44444, 0, 0, 0.26667],
+ 710: [0, 0.69444, 0, 0, 0.5],
+ 711: [0, 0.63194, 0, 0, 0.5],
+ 713: [0, 0.60889, 0, 0, 0.5],
+ 714: [0, 0.69444, 0, 0, 0.5],
+ 715: [0, 0.69444, 0, 0, 0.5],
+ 728: [0, 0.69444, 0, 0, 0.5],
+ 729: [0, 0.67937, 0, 0, 0.27778],
+ 730: [0, 0.69444, 0, 0, 0.66667],
+ 732: [0, 0.67659, 0, 0, 0.5],
+ 733: [0, 0.69444, 0, 0, 0.5],
+ 915: [0, 0.69444, 0, 0, 0.54167],
+ 916: [0, 0.69444, 0, 0, 0.83334],
+ 920: [0, 0.69444, 0, 0, 0.77778],
+ 923: [0, 0.69444, 0, 0, 0.61111],
+ 926: [0, 0.69444, 0, 0, 0.66667],
+ 928: [0, 0.69444, 0, 0, 0.70834],
+ 931: [0, 0.69444, 0, 0, 0.72222],
+ 933: [0, 0.69444, 0, 0, 0.77778],
+ 934: [0, 0.69444, 0, 0, 0.72222],
+ 936: [0, 0.69444, 0, 0, 0.77778],
+ 937: [0, 0.69444, 0, 0, 0.72222],
+ 8211: [0, 0.44444, 0.02778, 0, 0.5],
+ 8212: [0, 0.44444, 0.02778, 0, 1],
+ 8216: [0, 0.69444, 0, 0, 0.27778],
+ 8217: [0, 0.69444, 0, 0, 0.27778],
+ 8220: [0, 0.69444, 0, 0, 0.5],
+ 8221: [0, 0.69444, 0, 0, 0.5]
+ },
+ "Script-Regular": {
+ 32: [0, 0, 0, 0, 0.25],
+ 65: [0, 0.7, 0.22925, 0, 0.80253],
+ 66: [0, 0.7, 0.04087, 0, 0.90757],
+ 67: [0, 0.7, 0.1689, 0, 0.66619],
+ 68: [0, 0.7, 0.09371, 0, 0.77443],
+ 69: [0, 0.7, 0.18583, 0, 0.56162],
+ 70: [0, 0.7, 0.13634, 0, 0.89544],
+ 71: [0, 0.7, 0.17322, 0, 0.60961],
+ 72: [0, 0.7, 0.29694, 0, 0.96919],
+ 73: [0, 0.7, 0.19189, 0, 0.80907],
+ 74: [0.27778, 0.7, 0.19189, 0, 1.05159],
+ 75: [0, 0.7, 0.31259, 0, 0.91364],
+ 76: [0, 0.7, 0.19189, 0, 0.87373],
+ 77: [0, 0.7, 0.15981, 0, 1.08031],
+ 78: [0, 0.7, 0.3525, 0, 0.9015],
+ 79: [0, 0.7, 0.08078, 0, 0.73787],
+ 80: [0, 0.7, 0.08078, 0, 1.01262],
+ 81: [0, 0.7, 0.03305, 0, 0.88282],
+ 82: [0, 0.7, 0.06259, 0, 0.85],
+ 83: [0, 0.7, 0.19189, 0, 0.86767],
+ 84: [0, 0.7, 0.29087, 0, 0.74697],
+ 85: [0, 0.7, 0.25815, 0, 0.79996],
+ 86: [0, 0.7, 0.27523, 0, 0.62204],
+ 87: [0, 0.7, 0.27523, 0, 0.80532],
+ 88: [0, 0.7, 0.26006, 0, 0.94445],
+ 89: [0, 0.7, 0.2939, 0, 0.70961],
+ 90: [0, 0.7, 0.24037, 0, 0.8212],
+ 160: [0, 0, 0, 0, 0.25]
+ },
+ "Size1-Regular": {
+ 32: [0, 0, 0, 0, 0.25],
+ 40: [0.35001, 0.85, 0, 0, 0.45834],
+ 41: [0.35001, 0.85, 0, 0, 0.45834],
+ 47: [0.35001, 0.85, 0, 0, 0.57778],
+ 91: [0.35001, 0.85, 0, 0, 0.41667],
+ 92: [0.35001, 0.85, 0, 0, 0.57778],
+ 93: [0.35001, 0.85, 0, 0, 0.41667],
+ 123: [0.35001, 0.85, 0, 0, 0.58334],
+ 125: [0.35001, 0.85, 0, 0, 0.58334],
+ 160: [0, 0, 0, 0, 0.25],
+ 710: [0, 0.72222, 0, 0, 0.55556],
+ 732: [0, 0.72222, 0, 0, 0.55556],
+ 770: [0, 0.72222, 0, 0, 0.55556],
+ 771: [0, 0.72222, 0, 0, 0.55556],
+ 8214: [-99e-5, 0.601, 0, 0, 0.77778],
+ 8593: [1e-5, 0.6, 0, 0, 0.66667],
+ 8595: [1e-5, 0.6, 0, 0, 0.66667],
+ 8657: [1e-5, 0.6, 0, 0, 0.77778],
+ 8659: [1e-5, 0.6, 0, 0, 0.77778],
+ 8719: [0.25001, 0.75, 0, 0, 0.94445],
+ 8720: [0.25001, 0.75, 0, 0, 0.94445],
+ 8721: [0.25001, 0.75, 0, 0, 1.05556],
+ 8730: [0.35001, 0.85, 0, 0, 1],
+ 8739: [-599e-5, 0.606, 0, 0, 0.33333],
+ 8741: [-599e-5, 0.606, 0, 0, 0.55556],
+ 8747: [0.30612, 0.805, 0.19445, 0, 0.47222],
+ 8748: [0.306, 0.805, 0.19445, 0, 0.47222],
+ 8749: [0.306, 0.805, 0.19445, 0, 0.47222],
+ 8750: [0.30612, 0.805, 0.19445, 0, 0.47222],
+ 8896: [0.25001, 0.75, 0, 0, 0.83334],
+ 8897: [0.25001, 0.75, 0, 0, 0.83334],
+ 8898: [0.25001, 0.75, 0, 0, 0.83334],
+ 8899: [0.25001, 0.75, 0, 0, 0.83334],
+ 8968: [0.35001, 0.85, 0, 0, 0.47222],
+ 8969: [0.35001, 0.85, 0, 0, 0.47222],
+ 8970: [0.35001, 0.85, 0, 0, 0.47222],
+ 8971: [0.35001, 0.85, 0, 0, 0.47222],
+ 9168: [-99e-5, 0.601, 0, 0, 0.66667],
+ 10216: [0.35001, 0.85, 0, 0, 0.47222],
+ 10217: [0.35001, 0.85, 0, 0, 0.47222],
+ 10752: [0.25001, 0.75, 0, 0, 1.11111],
+ 10753: [0.25001, 0.75, 0, 0, 1.11111],
+ 10754: [0.25001, 0.75, 0, 0, 1.11111],
+ 10756: [0.25001, 0.75, 0, 0, 0.83334],
+ 10758: [0.25001, 0.75, 0, 0, 0.83334]
+ },
+ "Size2-Regular": {
+ 32: [0, 0, 0, 0, 0.25],
+ 40: [0.65002, 1.15, 0, 0, 0.59722],
+ 41: [0.65002, 1.15, 0, 0, 0.59722],
+ 47: [0.65002, 1.15, 0, 0, 0.81111],
+ 91: [0.65002, 1.15, 0, 0, 0.47222],
+ 92: [0.65002, 1.15, 0, 0, 0.81111],
+ 93: [0.65002, 1.15, 0, 0, 0.47222],
+ 123: [0.65002, 1.15, 0, 0, 0.66667],
+ 125: [0.65002, 1.15, 0, 0, 0.66667],
+ 160: [0, 0, 0, 0, 0.25],
+ 710: [0, 0.75, 0, 0, 1],
+ 732: [0, 0.75, 0, 0, 1],
+ 770: [0, 0.75, 0, 0, 1],
+ 771: [0, 0.75, 0, 0, 1],
+ 8719: [0.55001, 1.05, 0, 0, 1.27778],
+ 8720: [0.55001, 1.05, 0, 0, 1.27778],
+ 8721: [0.55001, 1.05, 0, 0, 1.44445],
+ 8730: [0.65002, 1.15, 0, 0, 1],
+ 8747: [0.86225, 1.36, 0.44445, 0, 0.55556],
+ 8748: [0.862, 1.36, 0.44445, 0, 0.55556],
+ 8749: [0.862, 1.36, 0.44445, 0, 0.55556],
+ 8750: [0.86225, 1.36, 0.44445, 0, 0.55556],
+ 8896: [0.55001, 1.05, 0, 0, 1.11111],
+ 8897: [0.55001, 1.05, 0, 0, 1.11111],
+ 8898: [0.55001, 1.05, 0, 0, 1.11111],
+ 8899: [0.55001, 1.05, 0, 0, 1.11111],
+ 8968: [0.65002, 1.15, 0, 0, 0.52778],
+ 8969: [0.65002, 1.15, 0, 0, 0.52778],
+ 8970: [0.65002, 1.15, 0, 0, 0.52778],
+ 8971: [0.65002, 1.15, 0, 0, 0.52778],
+ 10216: [0.65002, 1.15, 0, 0, 0.61111],
+ 10217: [0.65002, 1.15, 0, 0, 0.61111],
+ 10752: [0.55001, 1.05, 0, 0, 1.51112],
+ 10753: [0.55001, 1.05, 0, 0, 1.51112],
+ 10754: [0.55001, 1.05, 0, 0, 1.51112],
+ 10756: [0.55001, 1.05, 0, 0, 1.11111],
+ 10758: [0.55001, 1.05, 0, 0, 1.11111]
+ },
+ "Size3-Regular": {
+ 32: [0, 0, 0, 0, 0.25],
+ 40: [0.95003, 1.45, 0, 0, 0.73611],
+ 41: [0.95003, 1.45, 0, 0, 0.73611],
+ 47: [0.95003, 1.45, 0, 0, 1.04445],
+ 91: [0.95003, 1.45, 0, 0, 0.52778],
+ 92: [0.95003, 1.45, 0, 0, 1.04445],
+ 93: [0.95003, 1.45, 0, 0, 0.52778],
+ 123: [0.95003, 1.45, 0, 0, 0.75],
+ 125: [0.95003, 1.45, 0, 0, 0.75],
+ 160: [0, 0, 0, 0, 0.25],
+ 710: [0, 0.75, 0, 0, 1.44445],
+ 732: [0, 0.75, 0, 0, 1.44445],
+ 770: [0, 0.75, 0, 0, 1.44445],
+ 771: [0, 0.75, 0, 0, 1.44445],
+ 8730: [0.95003, 1.45, 0, 0, 1],
+ 8968: [0.95003, 1.45, 0, 0, 0.58334],
+ 8969: [0.95003, 1.45, 0, 0, 0.58334],
+ 8970: [0.95003, 1.45, 0, 0, 0.58334],
+ 8971: [0.95003, 1.45, 0, 0, 0.58334],
+ 10216: [0.95003, 1.45, 0, 0, 0.75],
+ 10217: [0.95003, 1.45, 0, 0, 0.75]
+ },
+ "Size4-Regular": {
+ 32: [0, 0, 0, 0, 0.25],
+ 40: [1.25003, 1.75, 0, 0, 0.79167],
+ 41: [1.25003, 1.75, 0, 0, 0.79167],
+ 47: [1.25003, 1.75, 0, 0, 1.27778],
+ 91: [1.25003, 1.75, 0, 0, 0.58334],
+ 92: [1.25003, 1.75, 0, 0, 1.27778],
+ 93: [1.25003, 1.75, 0, 0, 0.58334],
+ 123: [1.25003, 1.75, 0, 0, 0.80556],
+ 125: [1.25003, 1.75, 0, 0, 0.80556],
+ 160: [0, 0, 0, 0, 0.25],
+ 710: [0, 0.825, 0, 0, 1.8889],
+ 732: [0, 0.825, 0, 0, 1.8889],
+ 770: [0, 0.825, 0, 0, 1.8889],
+ 771: [0, 0.825, 0, 0, 1.8889],
+ 8730: [1.25003, 1.75, 0, 0, 1],
+ 8968: [1.25003, 1.75, 0, 0, 0.63889],
+ 8969: [1.25003, 1.75, 0, 0, 0.63889],
+ 8970: [1.25003, 1.75, 0, 0, 0.63889],
+ 8971: [1.25003, 1.75, 0, 0, 0.63889],
+ 9115: [0.64502, 1.155, 0, 0, 0.875],
+ 9116: [1e-5, 0.6, 0, 0, 0.875],
+ 9117: [0.64502, 1.155, 0, 0, 0.875],
+ 9118: [0.64502, 1.155, 0, 0, 0.875],
+ 9119: [1e-5, 0.6, 0, 0, 0.875],
+ 9120: [0.64502, 1.155, 0, 0, 0.875],
+ 9121: [0.64502, 1.155, 0, 0, 0.66667],
+ 9122: [-99e-5, 0.601, 0, 0, 0.66667],
+ 9123: [0.64502, 1.155, 0, 0, 0.66667],
+ 9124: [0.64502, 1.155, 0, 0, 0.66667],
+ 9125: [-99e-5, 0.601, 0, 0, 0.66667],
+ 9126: [0.64502, 1.155, 0, 0, 0.66667],
+ 9127: [1e-5, 0.9, 0, 0, 0.88889],
+ 9128: [0.65002, 1.15, 0, 0, 0.88889],
+ 9129: [0.90001, 0, 0, 0, 0.88889],
+ 9130: [0, 0.3, 0, 0, 0.88889],
+ 9131: [1e-5, 0.9, 0, 0, 0.88889],
+ 9132: [0.65002, 1.15, 0, 0, 0.88889],
+ 9133: [0.90001, 0, 0, 0, 0.88889],
+ 9143: [0.88502, 0.915, 0, 0, 1.05556],
+ 10216: [1.25003, 1.75, 0, 0, 0.80556],
+ 10217: [1.25003, 1.75, 0, 0, 0.80556],
+ 57344: [-499e-5, 0.605, 0, 0, 1.05556],
+ 57345: [-499e-5, 0.605, 0, 0, 1.05556],
+ 57680: [0, 0.12, 0, 0, 0.45],
+ 57681: [0, 0.12, 0, 0, 0.45],
+ 57682: [0, 0.12, 0, 0, 0.45],
+ 57683: [0, 0.12, 0, 0, 0.45]
+ },
+ "Typewriter-Regular": {
+ 32: [0, 0, 0, 0, 0.525],
+ 33: [0, 0.61111, 0, 0, 0.525],
+ 34: [0, 0.61111, 0, 0, 0.525],
+ 35: [0, 0.61111, 0, 0, 0.525],
+ 36: [0.08333, 0.69444, 0, 0, 0.525],
+ 37: [0.08333, 0.69444, 0, 0, 0.525],
+ 38: [0, 0.61111, 0, 0, 0.525],
+ 39: [0, 0.61111, 0, 0, 0.525],
+ 40: [0.08333, 0.69444, 0, 0, 0.525],
+ 41: [0.08333, 0.69444, 0, 0, 0.525],
+ 42: [0, 0.52083, 0, 0, 0.525],
+ 43: [-0.08056, 0.53055, 0, 0, 0.525],
+ 44: [0.13889, 0.125, 0, 0, 0.525],
+ 45: [-0.08056, 0.53055, 0, 0, 0.525],
+ 46: [0, 0.125, 0, 0, 0.525],
+ 47: [0.08333, 0.69444, 0, 0, 0.525],
+ 48: [0, 0.61111, 0, 0, 0.525],
+ 49: [0, 0.61111, 0, 0, 0.525],
+ 50: [0, 0.61111, 0, 0, 0.525],
+ 51: [0, 0.61111, 0, 0, 0.525],
+ 52: [0, 0.61111, 0, 0, 0.525],
+ 53: [0, 0.61111, 0, 0, 0.525],
+ 54: [0, 0.61111, 0, 0, 0.525],
+ 55: [0, 0.61111, 0, 0, 0.525],
+ 56: [0, 0.61111, 0, 0, 0.525],
+ 57: [0, 0.61111, 0, 0, 0.525],
+ 58: [0, 0.43056, 0, 0, 0.525],
+ 59: [0.13889, 0.43056, 0, 0, 0.525],
+ 60: [-0.05556, 0.55556, 0, 0, 0.525],
+ 61: [-0.19549, 0.41562, 0, 0, 0.525],
+ 62: [-0.05556, 0.55556, 0, 0, 0.525],
+ 63: [0, 0.61111, 0, 0, 0.525],
+ 64: [0, 0.61111, 0, 0, 0.525],
+ 65: [0, 0.61111, 0, 0, 0.525],
+ 66: [0, 0.61111, 0, 0, 0.525],
+ 67: [0, 0.61111, 0, 0, 0.525],
+ 68: [0, 0.61111, 0, 0, 0.525],
+ 69: [0, 0.61111, 0, 0, 0.525],
+ 70: [0, 0.61111, 0, 0, 0.525],
+ 71: [0, 0.61111, 0, 0, 0.525],
+ 72: [0, 0.61111, 0, 0, 0.525],
+ 73: [0, 0.61111, 0, 0, 0.525],
+ 74: [0, 0.61111, 0, 0, 0.525],
+ 75: [0, 0.61111, 0, 0, 0.525],
+ 76: [0, 0.61111, 0, 0, 0.525],
+ 77: [0, 0.61111, 0, 0, 0.525],
+ 78: [0, 0.61111, 0, 0, 0.525],
+ 79: [0, 0.61111, 0, 0, 0.525],
+ 80: [0, 0.61111, 0, 0, 0.525],
+ 81: [0.13889, 0.61111, 0, 0, 0.525],
+ 82: [0, 0.61111, 0, 0, 0.525],
+ 83: [0, 0.61111, 0, 0, 0.525],
+ 84: [0, 0.61111, 0, 0, 0.525],
+ 85: [0, 0.61111, 0, 0, 0.525],
+ 86: [0, 0.61111, 0, 0, 0.525],
+ 87: [0, 0.61111, 0, 0, 0.525],
+ 88: [0, 0.61111, 0, 0, 0.525],
+ 89: [0, 0.61111, 0, 0, 0.525],
+ 90: [0, 0.61111, 0, 0, 0.525],
+ 91: [0.08333, 0.69444, 0, 0, 0.525],
+ 92: [0.08333, 0.69444, 0, 0, 0.525],
+ 93: [0.08333, 0.69444, 0, 0, 0.525],
+ 94: [0, 0.61111, 0, 0, 0.525],
+ 95: [0.09514, 0, 0, 0, 0.525],
+ 96: [0, 0.61111, 0, 0, 0.525],
+ 97: [0, 0.43056, 0, 0, 0.525],
+ 98: [0, 0.61111, 0, 0, 0.525],
+ 99: [0, 0.43056, 0, 0, 0.525],
+ 100: [0, 0.61111, 0, 0, 0.525],
+ 101: [0, 0.43056, 0, 0, 0.525],
+ 102: [0, 0.61111, 0, 0, 0.525],
+ 103: [0.22222, 0.43056, 0, 0, 0.525],
+ 104: [0, 0.61111, 0, 0, 0.525],
+ 105: [0, 0.61111, 0, 0, 0.525],
+ 106: [0.22222, 0.61111, 0, 0, 0.525],
+ 107: [0, 0.61111, 0, 0, 0.525],
+ 108: [0, 0.61111, 0, 0, 0.525],
+ 109: [0, 0.43056, 0, 0, 0.525],
+ 110: [0, 0.43056, 0, 0, 0.525],
+ 111: [0, 0.43056, 0, 0, 0.525],
+ 112: [0.22222, 0.43056, 0, 0, 0.525],
+ 113: [0.22222, 0.43056, 0, 0, 0.525],
+ 114: [0, 0.43056, 0, 0, 0.525],
+ 115: [0, 0.43056, 0, 0, 0.525],
+ 116: [0, 0.55358, 0, 0, 0.525],
+ 117: [0, 0.43056, 0, 0, 0.525],
+ 118: [0, 0.43056, 0, 0, 0.525],
+ 119: [0, 0.43056, 0, 0, 0.525],
+ 120: [0, 0.43056, 0, 0, 0.525],
+ 121: [0.22222, 0.43056, 0, 0, 0.525],
+ 122: [0, 0.43056, 0, 0, 0.525],
+ 123: [0.08333, 0.69444, 0, 0, 0.525],
+ 124: [0.08333, 0.69444, 0, 0, 0.525],
+ 125: [0.08333, 0.69444, 0, 0, 0.525],
+ 126: [0, 0.61111, 0, 0, 0.525],
+ 127: [0, 0.61111, 0, 0, 0.525],
+ 160: [0, 0, 0, 0, 0.525],
+ 176: [0, 0.61111, 0, 0, 0.525],
+ 184: [0.19445, 0, 0, 0, 0.525],
+ 305: [0, 0.43056, 0, 0, 0.525],
+ 567: [0.22222, 0.43056, 0, 0, 0.525],
+ 711: [0, 0.56597, 0, 0, 0.525],
+ 713: [0, 0.56555, 0, 0, 0.525],
+ 714: [0, 0.61111, 0, 0, 0.525],
+ 715: [0, 0.61111, 0, 0, 0.525],
+ 728: [0, 0.61111, 0, 0, 0.525],
+ 730: [0, 0.61111, 0, 0, 0.525],
+ 770: [0, 0.61111, 0, 0, 0.525],
+ 771: [0, 0.61111, 0, 0, 0.525],
+ 776: [0, 0.61111, 0, 0, 0.525],
+ 915: [0, 0.61111, 0, 0, 0.525],
+ 916: [0, 0.61111, 0, 0, 0.525],
+ 920: [0, 0.61111, 0, 0, 0.525],
+ 923: [0, 0.61111, 0, 0, 0.525],
+ 926: [0, 0.61111, 0, 0, 0.525],
+ 928: [0, 0.61111, 0, 0, 0.525],
+ 931: [0, 0.61111, 0, 0, 0.525],
+ 933: [0, 0.61111, 0, 0, 0.525],
+ 934: [0, 0.61111, 0, 0, 0.525],
+ 936: [0, 0.61111, 0, 0, 0.525],
+ 937: [0, 0.61111, 0, 0, 0.525],
+ 8216: [0, 0.61111, 0, 0, 0.525],
+ 8217: [0, 0.61111, 0, 0, 0.525],
+ 8242: [0, 0.61111, 0, 0, 0.525],
+ 9251: [0.11111, 0.21944, 0, 0, 0.525]
+ }
+ };
+ const Q0 = {
+ slant: [0.25, 0.25, 0.25],
+ // sigma1
+ space: [0, 0, 0],
+ // sigma2
+ stretch: [0, 0, 0],
+ // sigma3
+ shrink: [0, 0, 0],
+ // sigma4
+ xHeight: [0.431, 0.431, 0.431],
+ // sigma5
+ quad: [1, 1.171, 1.472],
+ // sigma6
+ extraSpace: [0, 0, 0],
+ // sigma7
+ num1: [0.677, 0.732, 0.925],
+ // sigma8
+ num2: [0.394, 0.384, 0.387],
+ // sigma9
+ num3: [0.444, 0.471, 0.504],
+ // sigma10
+ denom1: [0.686, 0.752, 1.025],
+ // sigma11
+ denom2: [0.345, 0.344, 0.532],
+ // sigma12
+ sup1: [0.413, 0.503, 0.504],
+ // sigma13
+ sup2: [0.363, 0.431, 0.404],
+ // sigma14
+ sup3: [0.289, 0.286, 0.294],
+ // sigma15
+ sub1: [0.15, 0.143, 0.2],
+ // sigma16
+ sub2: [0.247, 0.286, 0.4],
+ // sigma17
+ supDrop: [0.386, 0.353, 0.494],
+ // sigma18
+ subDrop: [0.05, 0.071, 0.1],
+ // sigma19
+ delim1: [2.39, 1.7, 1.98],
+ // sigma20
+ delim2: [1.01, 1.157, 1.42],
+ // sigma21
+ axisHeight: [0.25, 0.25, 0.25],
+ // sigma22
+ // These font metrics are extracted from TeX by using tftopl on cmex10.tfm;
+ // they correspond to the font parameters of the extension fonts (family 3).
+ // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to
+ // match cmex7, we'd use cmex7.tfm values for script and scriptscript
+ // values.
+ defaultRuleThickness: [0.04, 0.049, 0.049],
+ // xi8; cmex7: 0.049
+ bigOpSpacing1: [0.111, 0.111, 0.111],
+ // xi9
+ bigOpSpacing2: [0.166, 0.166, 0.166],
+ // xi10
+ bigOpSpacing3: [0.2, 0.2, 0.2],
+ // xi11
+ bigOpSpacing4: [0.6, 0.611, 0.611],
+ // xi12; cmex7: 0.611
+ bigOpSpacing5: [0.1, 0.143, 0.143],
+ // xi13; cmex7: 0.143
+ // The \sqrt rule width is taken from the height of the surd character.
+ // Since we use the same font at all sizes, this thickness doesn't scale.
+ sqrtRuleThickness: [0.04, 0.04, 0.04],
+ // This value determines how large a pt is, for metrics which are defined
+ // in terms of pts.
+ // This value is also used in katex.less; if you change it make sure the
+ // values match.
+ ptPerEm: [10, 10, 10],
+ // The space between adjacent `|` columns in an array definition. From
+ // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm.
+ doubleRuleSep: [0.2, 0.2, 0.2],
+ // The width of separator lines in {array} environments. From
+ // `\showthe\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm.
+ arrayRuleWidth: [0.04, 0.04, 0.04],
+ // Two values from LaTeX source2e:
+ fboxsep: [0.3, 0.3, 0.3],
+ // 3 pt / ptPerEm
+ fboxrule: [0.04, 0.04, 0.04]
+ // 0.4 pt / ptPerEm
+ }, J0 = {
+ // Latin-1
+ Å: "A",
+ Ð: "D",
+ Þ: "o",
+ å: "a",
+ ð: "d",
+ þ: "o",
+ // Cyrillic
+ А: "A",
+ Б: "B",
+ В: "B",
+ Г: "F",
+ Д: "A",
+ Е: "E",
+ Ж: "K",
+ З: "3",
+ И: "N",
+ Й: "N",
+ К: "K",
+ Л: "N",
+ М: "M",
+ Н: "H",
+ О: "O",
+ П: "N",
+ Р: "P",
+ С: "C",
+ Т: "T",
+ У: "y",
+ Ф: "O",
+ Х: "X",
+ Ц: "U",
+ Ч: "h",
+ Ш: "W",
+ Щ: "W",
+ Ъ: "B",
+ Ы: "X",
+ Ь: "B",
+ Э: "3",
+ Ю: "X",
+ Я: "R",
+ а: "a",
+ б: "b",
+ в: "a",
+ г: "r",
+ д: "y",
+ е: "e",
+ ж: "m",
+ з: "e",
+ и: "n",
+ й: "n",
+ к: "n",
+ л: "n",
+ м: "m",
+ н: "n",
+ о: "o",
+ п: "n",
+ р: "p",
+ с: "c",
+ т: "o",
+ у: "y",
+ ф: "b",
+ х: "x",
+ ц: "n",
+ ч: "n",
+ ш: "w",
+ щ: "w",
+ ъ: "a",
+ ы: "m",
+ ь: "a",
+ э: "e",
+ ю: "m",
+ я: "r"
+ };
+ function O0(t, e) {
+ gt[t] = e;
+ }
+ function Wt(t, e, n) {
+ if (!gt[e])
+ throw new Error("Font metrics not found for font: " + e + ".");
+ let l = t.charCodeAt(0), c = gt[e][l];
+ if (!c && t[0] in J0 && (l = J0[t[0]].charCodeAt(0), c = gt[e][l]), !c && n === "text" && tt(l) && (c = gt[e][77]), c)
+ return {
+ depth: c[0],
+ height: c[1],
+ italic: c[2],
+ skew: c[3],
+ width: c[4]
+ };
+ }
+ const jt = {};
+ function Rn(t) {
+ let e;
+ if (t >= 5 ? e = 0 : t >= 3 ? e = 1 : e = 2, !jt[e]) {
+ const n = jt[e] = {
+ cssEmPerMu: Q0.quad[e] / 18
+ };
+ for (const l in Q0)
+ Q0.hasOwnProperty(l) && (n[l] = Q0[l][e]);
+ }
+ return jt[e];
+ }
+ const In = [
+ // Each element contains [textsize, scriptsize, scriptscriptsize].
+ // The size mappings are taken from TeX with \normalsize=10pt.
+ [1, 1, 1],
+ // size1: [5, 5, 5] \tiny
+ [2, 1, 1],
+ // size2: [6, 5, 5]
+ [3, 1, 1],
+ // size3: [7, 5, 5] \scriptsize
+ [4, 2, 1],
+ // size4: [8, 6, 5] \footnotesize
+ [5, 2, 1],
+ // size5: [9, 6, 5] \small
+ [6, 3, 1],
+ // size6: [10, 7, 5] \normalsize
+ [7, 4, 2],
+ // size7: [12, 8, 6] \large
+ [8, 6, 3],
+ // size8: [14.4, 10, 7] \Large
+ [9, 7, 6],
+ // size9: [17.28, 12, 10] \LARGE
+ [10, 8, 7],
+ // size10: [20.74, 14.4, 12] \huge
+ [11, 10, 9]
+ // size11: [24.88, 20.74, 17.28] \HUGE
+ ], gn = [
+ // fontMetrics.js:getGlobalMetrics also uses size indexes, so if
+ // you change size indexes, change that function.
+ 0.5,
+ 0.6,
+ 0.7,
+ 0.8,
+ 0.9,
+ 1,
+ 1.2,
+ 1.44,
+ 1.728,
+ 2.074,
+ 2.488
+ ], $0 = function(t, e) {
+ return e.size < 2 ? t : In[t - 1][e.size - 1];
+ };
+ class At {
+ // A font family applies to a group of fonts (i.e. SansSerif), while a font
+ // represents a specific font (i.e. SansSerif Bold).
+ // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm
+ /**
+ * The base size index.
+ */
+ constructor(e) {
+ this.style = void 0, this.color = void 0, this.size = void 0, this.textSize = void 0, this.phantom = void 0, this.font = void 0, this.fontFamily = void 0, this.fontWeight = void 0, this.fontShape = void 0, this.sizeMultiplier = void 0, this.maxSize = void 0, this.minRuleThickness = void 0, this._fontMetrics = void 0, this.style = e.style, this.color = e.color, this.size = e.size || At.BASESIZE, this.textSize = e.textSize || this.size, this.phantom = !!e.phantom, this.font = e.font || "", this.fontFamily = e.fontFamily || "", this.fontWeight = e.fontWeight || "", this.fontShape = e.fontShape || "", this.sizeMultiplier = gn[this.size - 1], this.maxSize = e.maxSize, this.minRuleThickness = e.minRuleThickness, this._fontMetrics = void 0;
+ }
+ /**
+ * Returns a new options object with the same properties as "this". Properties
+ * from "extension" will be copied to the new options object.
+ */
+ extend(e) {
+ const n = {
+ style: this.style,
+ size: this.size,
+ textSize: this.textSize,
+ color: this.color,
+ phantom: this.phantom,
+ font: this.font,
+ fontFamily: this.fontFamily,
+ fontWeight: this.fontWeight,
+ fontShape: this.fontShape,
+ maxSize: this.maxSize,
+ minRuleThickness: this.minRuleThickness
+ };
+ for (const l in e)
+ e.hasOwnProperty(l) && (n[l] = e[l]);
+ return new At(n);
+ }
+ /**
+ * Return an options object with the given style. If `this.style === style`,
+ * returns `this`.
+ */
+ havingStyle(e) {
+ return this.style === e ? this : this.extend({
+ style: e,
+ size: $0(this.textSize, e)
+ });
+ }
+ /**
+ * Return an options object with a cramped version of the current style. If
+ * the current style is cramped, returns `this`.
+ */
+ havingCrampedStyle() {
+ return this.havingStyle(this.style.cramp());
+ }
+ /**
+ * Return an options object with the given size and in at least `\textstyle`.
+ * Returns `this` if appropriate.
+ */
+ havingSize(e) {
+ return this.size === e && this.textSize === e ? this : this.extend({
+ style: this.style.text(),
+ size: e,
+ textSize: e,
+ sizeMultiplier: gn[e - 1]
+ });
+ }
+ /**
+ * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted,
+ * changes to at least `\textstyle`.
+ */
+ havingBaseStyle(e) {
+ e = e || this.style.text();
+ const n = $0(At.BASESIZE, e);
+ return this.size === n && this.textSize === At.BASESIZE && this.style === e ? this : this.extend({
+ style: e,
+ size: n
+ });
+ }
+ /**
+ * Remove the effect of sizing changes such as \Huge.
+ * Keep the effect of the current style, such as \scriptstyle.
+ */
+ havingBaseSizing() {
+ let e;
+ switch (this.style.id) {
+ case 4:
+ case 5:
+ e = 3;
+ break;
+ case 6:
+ case 7:
+ e = 1;
+ break;
+ default:
+ e = 6;
+ }
+ return this.extend({
+ style: this.style.text(),
+ size: e
+ });
+ }
+ /**
+ * Create a new options object with the given color.
+ */
+ withColor(e) {
+ return this.extend({
+ color: e
+ });
+ }
+ /**
+ * Create a new options object with "phantom" set to true.
+ */
+ withPhantom() {
+ return this.extend({
+ phantom: !0
+ });
+ }
+ /**
+ * Creates a new options object with the given math font or old text font.
+ * @type {[type]}
+ */
+ withFont(e) {
+ return this.extend({
+ font: e
+ });
+ }
+ /**
+ * Create a new options objects with the given fontFamily.
+ */
+ withTextFontFamily(e) {
+ return this.extend({
+ fontFamily: e,
+ font: ""
+ });
+ }
+ /**
+ * Creates a new options object with the given font weight
+ */
+ withTextFontWeight(e) {
+ return this.extend({
+ fontWeight: e,
+ font: ""
+ });
+ }
+ /**
+ * Creates a new options object with the given font weight
+ */
+ withTextFontShape(e) {
+ return this.extend({
+ fontShape: e,
+ font: ""
+ });
+ }
+ /**
+ * Return the CSS sizing classes required to switch from enclosing options
+ * `oldOptions` to `this`. Returns an array of classes.
+ */
+ sizingClasses(e) {
+ return e.size !== this.size ? ["sizing", "reset-size" + e.size, "size" + this.size] : [];
+ }
+ /**
+ * Return the CSS sizing classes required to switch to the base size. Like
+ * `this.havingSize(BASESIZE).sizingClasses(this)`.
+ */
+ baseSizingClasses() {
+ return this.size !== At.BASESIZE ? ["sizing", "reset-size" + this.size, "size" + At.BASESIZE] : [];
+ }
+ /**
+ * Return the font metrics for this size.
+ */
+ fontMetrics() {
+ return this._fontMetrics || (this._fontMetrics = Rn(this.size)), this._fontMetrics;
+ }
+ /**
+ * Gets the CSS color of the current options object
+ */
+ getColor() {
+ return this.phantom ? "transparent" : this.color;
+ }
+ }
+ At.BASESIZE = 6;
+ var en = At;
+ const y0 = {
+ // https://en.wikibooks.org/wiki/LaTeX/Lengths and
+ // https://tex.stackexchange.com/a/8263
+ pt: 1,
+ // TeX point
+ mm: 7227 / 2540,
+ // millimeter
+ cm: 7227 / 254,
+ // centimeter
+ in: 72.27,
+ // inch
+ bp: 803 / 800,
+ // big (PostScript) points
+ pc: 12,
+ // pica
+ dd: 1238 / 1157,
+ // didot
+ cc: 14856 / 1157,
+ // cicero (12 didot)
+ nd: 685 / 642,
+ // new didot
+ nc: 1370 / 107,
+ // new cicero (12 new didot)
+ sp: 1 / 65536,
+ // scaled point (TeX's internal smallest unit)
+ // https://tex.stackexchange.com/a/41371
+ px: 803 / 800
+ // \pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX
+ }, qt = {
+ ex: !0,
+ em: !0,
+ mu: !0
+ }, u0 = function(t) {
+ return typeof t != "string" && (t = t.unit), t in y0 || t in qt || t === "ex";
+ }, Ne = function(t, e) {
+ let n;
+ if (t.unit in y0)
+ n = y0[t.unit] / e.fontMetrics().ptPerEm / e.sizeMultiplier;
+ else if (t.unit === "mu")
+ n = e.fontMetrics().cssEmPerMu;
+ else {
+ let l;
+ if (e.style.isTight() ? l = e.havingStyle(e.style.text()) : l = e, t.unit === "ex")
+ n = l.fontMetrics().xHeight;
+ else if (t.unit === "em")
+ n = l.fontMetrics().quad;
+ else
+ throw new u("Invalid unit: '" + t.unit + "'");
+ l !== e && (n *= l.sizeMultiplier / e.sizeMultiplier);
+ }
+ return Math.min(t.number * n, e.maxSize);
+ }, $ = function(t) {
+ return +t.toFixed(4) + "em";
+ }, Xt = function(t) {
+ return t.filter((e) => e).join(" ");
+ }, _0 = function(t, e, n) {
+ if (this.classes = t || [], this.attributes = {}, this.height = 0, this.depth = 0, this.maxFontSize = 0, this.style = n || {}, e) {
+ e.style.isTight() && this.classes.push("mtight");
+ const l = e.getColor();
+ l && (this.style.color = l);
+ }
+ }, Ln = function(t) {
+ const e = document.createElement(t);
+ e.className = Xt(this.classes);
+ for (const n in this.style)
+ this.style.hasOwnProperty(n) && (e.style[n] = this.style[n]);
+ for (const n in this.attributes)
+ this.attributes.hasOwnProperty(n) && e.setAttribute(n, this.attributes[n]);
+ for (let n = 0; n < this.children.length; n++)
+ e.appendChild(this.children[n].toNode());
+ return e;
+ }, On = function(t) {
+ let e = "<" + t;
+ this.classes.length && (e += ' class="' + R.escape(Xt(this.classes)) + '"');
+ let n = "";
+ for (const l in this.style)
+ this.style.hasOwnProperty(l) && (n += R.hyphenate(l) + ":" + this.style[l] + ";");
+ n && (e += ' style="' + R.escape(n) + '"');
+ for (const l in this.attributes)
+ this.attributes.hasOwnProperty(l) && (e += " " + l + '="' + R.escape(this.attributes[l]) + '"');
+ e += ">";
+ for (let l = 0; l < this.children.length; l++)
+ e += this.children[l].toMarkup();
+ return e += "" + t + ">", e;
+ };
+ class Ge {
+ constructor(e, n, l, c) {
+ this.children = void 0, this.attributes = void 0, this.classes = void 0, this.height = void 0, this.depth = void 0, this.width = void 0, this.maxFontSize = void 0, this.style = void 0, _0.call(this, e, l, c), this.children = n || [];
+ }
+ /**
+ * Sets an arbitrary attribute on the span. Warning: use this wisely. Not
+ * all browsers support attributes the same, and having too many custom
+ * attributes is probably bad.
+ */
+ setAttribute(e, n) {
+ this.attributes[e] = n;
+ }
+ hasClass(e) {
+ return R.contains(this.classes, e);
+ }
+ toNode() {
+ return Ln.call(this, "span");
+ }
+ toMarkup() {
+ return On.call(this, "span");
+ }
+ }
+ class Yt {
+ constructor(e, n, l, c) {
+ this.children = void 0, this.attributes = void 0, this.classes = void 0, this.height = void 0, this.depth = void 0, this.maxFontSize = void 0, this.style = void 0, _0.call(this, n, c), this.children = l || [], this.setAttribute("href", e);
+ }
+ setAttribute(e, n) {
+ this.attributes[e] = n;
+ }
+ hasClass(e) {
+ return R.contains(this.classes, e);
+ }
+ toNode() {
+ return Ln.call(this, "a");
+ }
+ toMarkup() {
+ return On.call(this, "a");
+ }
+ }
+ class Tr {
+ constructor(e, n, l) {
+ this.src = void 0, this.alt = void 0, this.classes = void 0, this.height = void 0, this.depth = void 0, this.maxFontSize = void 0, this.style = void 0, this.alt = n, this.src = e, this.classes = ["mord"], this.style = l;
+ }
+ hasClass(e) {
+ return R.contains(this.classes, e);
+ }
+ toNode() {
+ const e = document.createElement("img");
+ e.src = this.src, e.alt = this.alt, e.className = "mord";
+ for (const n in this.style)
+ this.style.hasOwnProperty(n) && (e.style[n] = this.style[n]);
+ return e;
+ }
+ toMarkup() {
+ let e = ' ", e;
+ }
+ }
+ const qn = {
+ î: "ı̂",
+ ï: "ı̈",
+ í: "ı́",
+ // 'ī': '\u0131\u0304', // enable when we add Extended Latin
+ ì: "ı̀"
+ };
+ class st {
+ constructor(e, n, l, c, m, b, _, x) {
+ this.text = void 0, this.height = void 0, this.depth = void 0, this.italic = void 0, this.skew = void 0, this.width = void 0, this.maxFontSize = void 0, this.classes = void 0, this.style = void 0, this.text = e, this.height = n || 0, this.depth = l || 0, this.italic = c || 0, this.skew = m || 0, this.width = b || 0, this.classes = _ || [], this.style = x || {}, this.maxFontSize = 0;
+ const F = ie(this.text.charCodeAt(0));
+ F && this.classes.push(F + "_fallback"), /[îïíì]/.test(this.text) && (this.text = qn[this.text]);
+ }
+ hasClass(e) {
+ return R.contains(this.classes, e);
+ }
+ /**
+ * Creates a text node or span from a symbol node. Note that a span is only
+ * created if it is needed.
+ */
+ toNode() {
+ const e = document.createTextNode(this.text);
+ let n = null;
+ this.italic > 0 && (n = document.createElement("span"), n.style.marginRight = $(this.italic)), this.classes.length > 0 && (n = n || document.createElement("span"), n.className = Xt(this.classes));
+ for (const l in this.style)
+ this.style.hasOwnProperty(l) && (n = n || document.createElement("span"), n.style[l] = this.style[l]);
+ return n ? (n.appendChild(e), n) : e;
+ }
+ /**
+ * Creates markup for a symbol node.
+ */
+ toMarkup() {
+ let e = !1, n = " 0 && (l += "margin-right:" + this.italic + "em;");
+ for (const m in this.style)
+ this.style.hasOwnProperty(m) && (l += R.hyphenate(m) + ":" + this.style[m] + ";");
+ l && (e = !0, n += ' style="' + R.escape(l) + '"');
+ const c = R.escape(this.text);
+ return e ? (n += ">", n += c, n += " ", n) : c;
+ }
+ }
+ class St {
+ constructor(e, n) {
+ this.children = void 0, this.attributes = void 0, this.children = e || [], this.attributes = n || {};
+ }
+ toNode() {
+ const n = document.createElementNS("http://www.w3.org/2000/svg", "svg");
+ for (const l in this.attributes)
+ Object.prototype.hasOwnProperty.call(this.attributes, l) && n.setAttribute(l, this.attributes[l]);
+ for (let l = 0; l < this.children.length; l++)
+ n.appendChild(this.children[l].toNode());
+ return n;
+ }
+ toMarkup() {
+ let e = '";
+ for (let n = 0; n < this.children.length; n++)
+ e += this.children[n].toMarkup();
+ return e += " ", e;
+ }
+ }
+ class Pt {
+ constructor(e, n) {
+ this.pathName = void 0, this.alternate = void 0, this.pathName = e, this.alternate = n;
+ }
+ toNode() {
+ const n = document.createElementNS("http://www.w3.org/2000/svg", "path");
+ return this.alternate ? n.setAttribute("d", this.alternate) : n.setAttribute("d", L0[this.pathName]), n;
+ }
+ toMarkup() {
+ return this.alternate ? ' ' : ' ';
+ }
+ }
+ class bn {
+ constructor(e) {
+ this.attributes = void 0, this.attributes = e || {};
+ }
+ toNode() {
+ const n = document.createElementNS("http://www.w3.org/2000/svg", "line");
+ for (const l in this.attributes)
+ Object.prototype.hasOwnProperty.call(this.attributes, l) && n.setAttribute(l, this.attributes[l]);
+ return n;
+ }
+ toMarkup() {
+ let e = " ", e;
+ }
+ }
+ function wn(t) {
+ if (t instanceof st)
+ return t;
+ throw new Error("Expected symbolNode but got " + String(t) + ".");
+ }
+ function Pn(t) {
+ if (t instanceof Ge)
+ return t;
+ throw new Error("Expected span but got " + String(t) + ".");
+ }
+ const Mr = {
+ bin: 1,
+ close: 1,
+ inner: 1,
+ open: 1,
+ punct: 1,
+ rel: 1
+ }, Zt = {
+ "accent-token": 1,
+ mathord: 1,
+ "op-token": 1,
+ spacing: 1,
+ textord: 1
+ }, k0 = {
+ math: {},
+ text: {}
+ };
+ var Le = k0;
+ function h(t, e, n, l, c, m) {
+ k0[t][c] = {
+ font: e,
+ group: n,
+ replace: l
+ }, m && l && (k0[t][l] = k0[t][c]);
+ }
+ const d = "math", V = "text", w = "main", A = "ams", Re = "accent-token", re = "bin", nt = "close", x0 = "inner", G = "mathord", C = "op-token", j = "open", le = "punct", v = "rel", Oe = "spacing", E = "textord";
+ h(d, w, v, "≡", "\\equiv", !0), h(d, w, v, "≺", "\\prec", !0), h(d, w, v, "≻", "\\succ", !0), h(d, w, v, "∼", "\\sim", !0), h(d, w, v, "⊥", "\\perp"), h(d, w, v, "⪯", "\\preceq", !0), h(d, w, v, "⪰", "\\succeq", !0), h(d, w, v, "≃", "\\simeq", !0), h(d, w, v, "∣", "\\mid", !0), h(d, w, v, "≪", "\\ll", !0), h(d, w, v, "≫", "\\gg", !0), h(d, w, v, "≍", "\\asymp", !0), h(d, w, v, "∥", "\\parallel"), h(d, w, v, "⋈", "\\bowtie", !0), h(d, w, v, "⌣", "\\smile", !0), h(d, w, v, "⊑", "\\sqsubseteq", !0), h(d, w, v, "⊒", "\\sqsupseteq", !0), h(d, w, v, "≐", "\\doteq", !0), h(d, w, v, "⌢", "\\frown", !0), h(d, w, v, "∋", "\\ni", !0), h(d, w, v, "∝", "\\propto", !0), h(d, w, v, "⊢", "\\vdash", !0), h(d, w, v, "⊣", "\\dashv", !0), h(d, w, v, "∋", "\\owns"), h(d, w, le, ".", "\\ldotp"), h(d, w, le, "⋅", "\\cdotp"), h(d, w, E, "#", "\\#"), h(V, w, E, "#", "\\#"), h(d, w, E, "&", "\\&"), h(V, w, E, "&", "\\&"), h(d, w, E, "ℵ", "\\aleph", !0), h(d, w, E, "∀", "\\forall", !0), h(d, w, E, "ℏ", "\\hbar", !0), h(d, w, E, "∃", "\\exists", !0), h(d, w, E, "∇", "\\nabla", !0), h(d, w, E, "♭", "\\flat", !0), h(d, w, E, "ℓ", "\\ell", !0), h(d, w, E, "♮", "\\natural", !0), h(d, w, E, "♣", "\\clubsuit", !0), h(d, w, E, "℘", "\\wp", !0), h(d, w, E, "♯", "\\sharp", !0), h(d, w, E, "♢", "\\diamondsuit", !0), h(d, w, E, "ℜ", "\\Re", !0), h(d, w, E, "♡", "\\heartsuit", !0), h(d, w, E, "ℑ", "\\Im", !0), h(d, w, E, "♠", "\\spadesuit", !0), h(d, w, E, "§", "\\S", !0), h(V, w, E, "§", "\\S"), h(d, w, E, "¶", "\\P", !0), h(V, w, E, "¶", "\\P"), h(d, w, E, "†", "\\dag"), h(V, w, E, "†", "\\dag"), h(V, w, E, "†", "\\textdagger"), h(d, w, E, "‡", "\\ddag"), h(V, w, E, "‡", "\\ddag"), h(V, w, E, "‡", "\\textdaggerdbl"), h(d, w, nt, "⎱", "\\rmoustache", !0), h(d, w, j, "⎰", "\\lmoustache", !0), h(d, w, nt, "⟯", "\\rgroup", !0), h(d, w, j, "⟮", "\\lgroup", !0), h(d, w, re, "∓", "\\mp", !0), h(d, w, re, "⊖", "\\ominus", !0), h(d, w, re, "⊎", "\\uplus", !0), h(d, w, re, "⊓", "\\sqcap", !0), h(d, w, re, "∗", "\\ast"), h(d, w, re, "⊔", "\\sqcup", !0), h(d, w, re, "◯", "\\bigcirc", !0), h(d, w, re, "∙", "\\bullet", !0), h(d, w, re, "‡", "\\ddagger"), h(d, w, re, "≀", "\\wr", !0), h(d, w, re, "⨿", "\\amalg"), h(d, w, re, "&", "\\And"), h(d, w, v, "⟵", "\\longleftarrow", !0), h(d, w, v, "⇐", "\\Leftarrow", !0), h(d, w, v, "⟸", "\\Longleftarrow", !0), h(d, w, v, "⟶", "\\longrightarrow", !0), h(d, w, v, "⇒", "\\Rightarrow", !0), h(d, w, v, "⟹", "\\Longrightarrow", !0), h(d, w, v, "↔", "\\leftrightarrow", !0), h(d, w, v, "⟷", "\\longleftrightarrow", !0), h(d, w, v, "⇔", "\\Leftrightarrow", !0), h(d, w, v, "⟺", "\\Longleftrightarrow", !0), h(d, w, v, "↦", "\\mapsto", !0), h(d, w, v, "⟼", "\\longmapsto", !0), h(d, w, v, "↗", "\\nearrow", !0), h(d, w, v, "↩", "\\hookleftarrow", !0), h(d, w, v, "↪", "\\hookrightarrow", !0), h(d, w, v, "↘", "\\searrow", !0), h(d, w, v, "↼", "\\leftharpoonup", !0), h(d, w, v, "⇀", "\\rightharpoonup", !0), h(d, w, v, "↙", "\\swarrow", !0), h(d, w, v, "↽", "\\leftharpoondown", !0), h(d, w, v, "⇁", "\\rightharpoondown", !0), h(d, w, v, "↖", "\\nwarrow", !0), h(d, w, v, "⇌", "\\rightleftharpoons", !0), h(d, A, v, "≮", "\\nless", !0), h(d, A, v, "", "\\@nleqslant"), h(d, A, v, "", "\\@nleqq"), h(d, A, v, "⪇", "\\lneq", !0), h(d, A, v, "≨", "\\lneqq", !0), h(d, A, v, "", "\\@lvertneqq"), h(d, A, v, "⋦", "\\lnsim", !0), h(d, A, v, "⪉", "\\lnapprox", !0), h(d, A, v, "⊀", "\\nprec", !0), h(d, A, v, "⋠", "\\npreceq", !0), h(d, A, v, "⋨", "\\precnsim", !0), h(d, A, v, "⪹", "\\precnapprox", !0), h(d, A, v, "≁", "\\nsim", !0), h(d, A, v, "", "\\@nshortmid"), h(d, A, v, "∤", "\\nmid", !0), h(d, A, v, "⊬", "\\nvdash", !0), h(d, A, v, "⊭", "\\nvDash", !0), h(d, A, v, "⋪", "\\ntriangleleft"), h(d, A, v, "⋬", "\\ntrianglelefteq", !0), h(d, A, v, "⊊", "\\subsetneq", !0), h(d, A, v, "", "\\@varsubsetneq"), h(d, A, v, "⫋", "\\subsetneqq", !0), h(d, A, v, "", "\\@varsubsetneqq"), h(d, A, v, "≯", "\\ngtr", !0), h(d, A, v, "", "\\@ngeqslant"), h(d, A, v, "", "\\@ngeqq"), h(d, A, v, "⪈", "\\gneq", !0), h(d, A, v, "≩", "\\gneqq", !0), h(d, A, v, "", "\\@gvertneqq"), h(d, A, v, "⋧", "\\gnsim", !0), h(d, A, v, "⪊", "\\gnapprox", !0), h(d, A, v, "⊁", "\\nsucc", !0), h(d, A, v, "⋡", "\\nsucceq", !0), h(d, A, v, "⋩", "\\succnsim", !0), h(d, A, v, "⪺", "\\succnapprox", !0), h(d, A, v, "≆", "\\ncong", !0), h(d, A, v, "", "\\@nshortparallel"), h(d, A, v, "∦", "\\nparallel", !0), h(d, A, v, "⊯", "\\nVDash", !0), h(d, A, v, "⋫", "\\ntriangleright"), h(d, A, v, "⋭", "\\ntrianglerighteq", !0), h(d, A, v, "", "\\@nsupseteqq"), h(d, A, v, "⊋", "\\supsetneq", !0), h(d, A, v, "", "\\@varsupsetneq"), h(d, A, v, "⫌", "\\supsetneqq", !0), h(d, A, v, "", "\\@varsupsetneqq"), h(d, A, v, "⊮", "\\nVdash", !0), h(d, A, v, "⪵", "\\precneqq", !0), h(d, A, v, "⪶", "\\succneqq", !0), h(d, A, v, "", "\\@nsubseteqq"), h(d, A, re, "⊴", "\\unlhd"), h(d, A, re, "⊵", "\\unrhd"), h(d, A, v, "↚", "\\nleftarrow", !0), h(d, A, v, "↛", "\\nrightarrow", !0), h(d, A, v, "⇍", "\\nLeftarrow", !0), h(d, A, v, "⇏", "\\nRightarrow", !0), h(d, A, v, "↮", "\\nleftrightarrow", !0), h(d, A, v, "⇎", "\\nLeftrightarrow", !0), h(d, A, v, "△", "\\vartriangle"), h(d, A, E, "ℏ", "\\hslash"), h(d, A, E, "▽", "\\triangledown"), h(d, A, E, "◊", "\\lozenge"), h(d, A, E, "Ⓢ", "\\circledS"), h(d, A, E, "®", "\\circledR"), h(V, A, E, "®", "\\circledR"), h(d, A, E, "∡", "\\measuredangle", !0), h(d, A, E, "∄", "\\nexists"), h(d, A, E, "℧", "\\mho"), h(d, A, E, "Ⅎ", "\\Finv", !0), h(d, A, E, "⅁", "\\Game", !0), h(d, A, E, "‵", "\\backprime"), h(d, A, E, "▲", "\\blacktriangle"), h(d, A, E, "▼", "\\blacktriangledown"), h(d, A, E, "■", "\\blacksquare"), h(d, A, E, "⧫", "\\blacklozenge"), h(d, A, E, "★", "\\bigstar"), h(d, A, E, "∢", "\\sphericalangle", !0), h(d, A, E, "∁", "\\complement", !0), h(d, A, E, "ð", "\\eth", !0), h(V, w, E, "ð", "ð"), h(d, A, E, "╱", "\\diagup"), h(d, A, E, "╲", "\\diagdown"), h(d, A, E, "□", "\\square"), h(d, A, E, "□", "\\Box"), h(d, A, E, "◊", "\\Diamond"), h(d, A, E, "¥", "\\yen", !0), h(V, A, E, "¥", "\\yen", !0), h(d, A, E, "✓", "\\checkmark", !0), h(V, A, E, "✓", "\\checkmark"), h(d, A, E, "ℶ", "\\beth", !0), h(d, A, E, "ℸ", "\\daleth", !0), h(d, A, E, "ℷ", "\\gimel", !0), h(d, A, E, "ϝ", "\\digamma", !0), h(d, A, E, "ϰ", "\\varkappa"), h(d, A, j, "┌", "\\@ulcorner", !0), h(d, A, nt, "┐", "\\@urcorner", !0), h(d, A, j, "└", "\\@llcorner", !0), h(d, A, nt, "┘", "\\@lrcorner", !0), h(d, A, v, "≦", "\\leqq", !0), h(d, A, v, "⩽", "\\leqslant", !0), h(d, A, v, "⪕", "\\eqslantless", !0), h(d, A, v, "≲", "\\lesssim", !0), h(d, A, v, "⪅", "\\lessapprox", !0), h(d, A, v, "≊", "\\approxeq", !0), h(d, A, re, "⋖", "\\lessdot"), h(d, A, v, "⋘", "\\lll", !0), h(d, A, v, "≶", "\\lessgtr", !0), h(d, A, v, "⋚", "\\lesseqgtr", !0), h(d, A, v, "⪋", "\\lesseqqgtr", !0), h(d, A, v, "≑", "\\doteqdot"), h(d, A, v, "≓", "\\risingdotseq", !0), h(d, A, v, "≒", "\\fallingdotseq", !0), h(d, A, v, "∽", "\\backsim", !0), h(d, A, v, "⋍", "\\backsimeq", !0), h(d, A, v, "⫅", "\\subseteqq", !0), h(d, A, v, "⋐", "\\Subset", !0), h(d, A, v, "⊏", "\\sqsubset", !0), h(d, A, v, "≼", "\\preccurlyeq", !0), h(d, A, v, "⋞", "\\curlyeqprec", !0), h(d, A, v, "≾", "\\precsim", !0), h(d, A, v, "⪷", "\\precapprox", !0), h(d, A, v, "⊲", "\\vartriangleleft"), h(d, A, v, "⊴", "\\trianglelefteq"), h(d, A, v, "⊨", "\\vDash", !0), h(d, A, v, "⊪", "\\Vvdash", !0), h(d, A, v, "⌣", "\\smallsmile"), h(d, A, v, "⌢", "\\smallfrown"), h(d, A, v, "≏", "\\bumpeq", !0), h(d, A, v, "≎", "\\Bumpeq", !0), h(d, A, v, "≧", "\\geqq", !0), h(d, A, v, "⩾", "\\geqslant", !0), h(d, A, v, "⪖", "\\eqslantgtr", !0), h(d, A, v, "≳", "\\gtrsim", !0), h(d, A, v, "⪆", "\\gtrapprox", !0), h(d, A, re, "⋗", "\\gtrdot"), h(d, A, v, "⋙", "\\ggg", !0), h(d, A, v, "≷", "\\gtrless", !0), h(d, A, v, "⋛", "\\gtreqless", !0), h(d, A, v, "⪌", "\\gtreqqless", !0), h(d, A, v, "≖", "\\eqcirc", !0), h(d, A, v, "≗", "\\circeq", !0), h(d, A, v, "≜", "\\triangleq", !0), h(d, A, v, "∼", "\\thicksim"), h(d, A, v, "≈", "\\thickapprox"), h(d, A, v, "⫆", "\\supseteqq", !0), h(d, A, v, "⋑", "\\Supset", !0), h(d, A, v, "⊐", "\\sqsupset", !0), h(d, A, v, "≽", "\\succcurlyeq", !0), h(d, A, v, "⋟", "\\curlyeqsucc", !0), h(d, A, v, "≿", "\\succsim", !0), h(d, A, v, "⪸", "\\succapprox", !0), h(d, A, v, "⊳", "\\vartriangleright"), h(d, A, v, "⊵", "\\trianglerighteq"), h(d, A, v, "⊩", "\\Vdash", !0), h(d, A, v, "∣", "\\shortmid"), h(d, A, v, "∥", "\\shortparallel"), h(d, A, v, "≬", "\\between", !0), h(d, A, v, "⋔", "\\pitchfork", !0), h(d, A, v, "∝", "\\varpropto"), h(d, A, v, "◀", "\\blacktriangleleft"), h(d, A, v, "∴", "\\therefore", !0), h(d, A, v, "∍", "\\backepsilon"), h(d, A, v, "▶", "\\blacktriangleright"), h(d, A, v, "∵", "\\because", !0), h(d, A, v, "⋘", "\\llless"), h(d, A, v, "⋙", "\\gggtr"), h(d, A, re, "⊲", "\\lhd"), h(d, A, re, "⊳", "\\rhd"), h(d, A, v, "≂", "\\eqsim", !0), h(d, w, v, "⋈", "\\Join"), h(d, A, v, "≑", "\\Doteq", !0), h(d, A, re, "∔", "\\dotplus", !0), h(d, A, re, "∖", "\\smallsetminus"), h(d, A, re, "⋒", "\\Cap", !0), h(d, A, re, "⋓", "\\Cup", !0), h(d, A, re, "⩞", "\\doublebarwedge", !0), h(d, A, re, "⊟", "\\boxminus", !0), h(d, A, re, "⊞", "\\boxplus", !0), h(d, A, re, "⋇", "\\divideontimes", !0), h(d, A, re, "⋉", "\\ltimes", !0), h(d, A, re, "⋊", "\\rtimes", !0), h(d, A, re, "⋋", "\\leftthreetimes", !0), h(d, A, re, "⋌", "\\rightthreetimes", !0), h(d, A, re, "⋏", "\\curlywedge", !0), h(d, A, re, "⋎", "\\curlyvee", !0), h(d, A, re, "⊝", "\\circleddash", !0), h(d, A, re, "⊛", "\\circledast", !0), h(d, A, re, "⋅", "\\centerdot"), h(d, A, re, "⊺", "\\intercal", !0), h(d, A, re, "⋒", "\\doublecap"), h(d, A, re, "⋓", "\\doublecup"), h(d, A, re, "⊠", "\\boxtimes", !0), h(d, A, v, "⇢", "\\dashrightarrow", !0), h(d, A, v, "⇠", "\\dashleftarrow", !0), h(d, A, v, "⇇", "\\leftleftarrows", !0), h(d, A, v, "⇆", "\\leftrightarrows", !0), h(d, A, v, "⇚", "\\Lleftarrow", !0), h(d, A, v, "↞", "\\twoheadleftarrow", !0), h(d, A, v, "↢", "\\leftarrowtail", !0), h(d, A, v, "↫", "\\looparrowleft", !0), h(d, A, v, "⇋", "\\leftrightharpoons", !0), h(d, A, v, "↶", "\\curvearrowleft", !0), h(d, A, v, "↺", "\\circlearrowleft", !0), h(d, A, v, "↰", "\\Lsh", !0), h(d, A, v, "⇈", "\\upuparrows", !0), h(d, A, v, "↿", "\\upharpoonleft", !0), h(d, A, v, "⇃", "\\downharpoonleft", !0), h(d, w, v, "⊶", "\\origof", !0), h(d, w, v, "⊷", "\\imageof", !0), h(d, A, v, "⊸", "\\multimap", !0), h(d, A, v, "↭", "\\leftrightsquigarrow", !0), h(d, A, v, "⇉", "\\rightrightarrows", !0), h(d, A, v, "⇄", "\\rightleftarrows", !0), h(d, A, v, "↠", "\\twoheadrightarrow", !0), h(d, A, v, "↣", "\\rightarrowtail", !0), h(d, A, v, "↬", "\\looparrowright", !0), h(d, A, v, "↷", "\\curvearrowright", !0), h(d, A, v, "↻", "\\circlearrowright", !0), h(d, A, v, "↱", "\\Rsh", !0), h(d, A, v, "⇊", "\\downdownarrows", !0), h(d, A, v, "↾", "\\upharpoonright", !0), h(d, A, v, "⇂", "\\downharpoonright", !0), h(d, A, v, "⇝", "\\rightsquigarrow", !0), h(d, A, v, "⇝", "\\leadsto"), h(d, A, v, "⇛", "\\Rrightarrow", !0), h(d, A, v, "↾", "\\restriction"), h(d, w, E, "‘", "`"), h(d, w, E, "$", "\\$"), h(V, w, E, "$", "\\$"), h(V, w, E, "$", "\\textdollar"), h(d, w, E, "%", "\\%"), h(V, w, E, "%", "\\%"), h(d, w, E, "_", "\\_"), h(V, w, E, "_", "\\_"), h(V, w, E, "_", "\\textunderscore"), h(d, w, E, "∠", "\\angle", !0), h(d, w, E, "∞", "\\infty", !0), h(d, w, E, "′", "\\prime"), h(d, w, E, "△", "\\triangle"), h(d, w, E, "Γ", "\\Gamma", !0), h(d, w, E, "Δ", "\\Delta", !0), h(d, w, E, "Θ", "\\Theta", !0), h(d, w, E, "Λ", "\\Lambda", !0), h(d, w, E, "Ξ", "\\Xi", !0), h(d, w, E, "Π", "\\Pi", !0), h(d, w, E, "Σ", "\\Sigma", !0), h(d, w, E, "Υ", "\\Upsilon", !0), h(d, w, E, "Φ", "\\Phi", !0), h(d, w, E, "Ψ", "\\Psi", !0), h(d, w, E, "Ω", "\\Omega", !0), h(d, w, E, "A", "Α"), h(d, w, E, "B", "Β"), h(d, w, E, "E", "Ε"), h(d, w, E, "Z", "Ζ"), h(d, w, E, "H", "Η"), h(d, w, E, "I", "Ι"), h(d, w, E, "K", "Κ"), h(d, w, E, "M", "Μ"), h(d, w, E, "N", "Ν"), h(d, w, E, "O", "Ο"), h(d, w, E, "P", "Ρ"), h(d, w, E, "T", "Τ"), h(d, w, E, "X", "Χ"), h(d, w, E, "¬", "\\neg", !0), h(d, w, E, "¬", "\\lnot"), h(d, w, E, "⊤", "\\top"), h(d, w, E, "⊥", "\\bot"), h(d, w, E, "∅", "\\emptyset"), h(d, A, E, "∅", "\\varnothing"), h(d, w, G, "α", "\\alpha", !0), h(d, w, G, "β", "\\beta", !0), h(d, w, G, "γ", "\\gamma", !0), h(d, w, G, "δ", "\\delta", !0), h(d, w, G, "ϵ", "\\epsilon", !0), h(d, w, G, "ζ", "\\zeta", !0), h(d, w, G, "η", "\\eta", !0), h(d, w, G, "θ", "\\theta", !0), h(d, w, G, "ι", "\\iota", !0), h(d, w, G, "κ", "\\kappa", !0), h(d, w, G, "λ", "\\lambda", !0), h(d, w, G, "μ", "\\mu", !0), h(d, w, G, "ν", "\\nu", !0), h(d, w, G, "ξ", "\\xi", !0), h(d, w, G, "ο", "\\omicron", !0), h(d, w, G, "π", "\\pi", !0), h(d, w, G, "ρ", "\\rho", !0), h(d, w, G, "σ", "\\sigma", !0), h(d, w, G, "τ", "\\tau", !0), h(d, w, G, "υ", "\\upsilon", !0), h(d, w, G, "ϕ", "\\phi", !0), h(d, w, G, "χ", "\\chi", !0), h(d, w, G, "ψ", "\\psi", !0), h(d, w, G, "ω", "\\omega", !0), h(d, w, G, "ε", "\\varepsilon", !0), h(d, w, G, "ϑ", "\\vartheta", !0), h(d, w, G, "ϖ", "\\varpi", !0), h(d, w, G, "ϱ", "\\varrho", !0), h(d, w, G, "ς", "\\varsigma", !0), h(d, w, G, "φ", "\\varphi", !0), h(d, w, re, "∗", "*", !0), h(d, w, re, "+", "+"), h(d, w, re, "−", "-", !0), h(d, w, re, "⋅", "\\cdot", !0), h(d, w, re, "∘", "\\circ", !0), h(d, w, re, "÷", "\\div", !0), h(d, w, re, "±", "\\pm", !0), h(d, w, re, "×", "\\times", !0), h(d, w, re, "∩", "\\cap", !0), h(d, w, re, "∪", "\\cup", !0), h(d, w, re, "∖", "\\setminus", !0), h(d, w, re, "∧", "\\land"), h(d, w, re, "∨", "\\lor"), h(d, w, re, "∧", "\\wedge", !0), h(d, w, re, "∨", "\\vee", !0), h(d, w, E, "√", "\\surd"), h(d, w, j, "⟨", "\\langle", !0), h(d, w, j, "∣", "\\lvert"), h(d, w, j, "∥", "\\lVert"), h(d, w, nt, "?", "?"), h(d, w, nt, "!", "!"), h(d, w, nt, "⟩", "\\rangle", !0), h(d, w, nt, "∣", "\\rvert"), h(d, w, nt, "∥", "\\rVert"), h(d, w, v, "=", "="), h(d, w, v, ":", ":"), h(d, w, v, "≈", "\\approx", !0), h(d, w, v, "≅", "\\cong", !0), h(d, w, v, "≥", "\\ge"), h(d, w, v, "≥", "\\geq", !0), h(d, w, v, "←", "\\gets"), h(d, w, v, ">", "\\gt", !0), h(d, w, v, "∈", "\\in", !0), h(d, w, v, "", "\\@not"), h(d, w, v, "⊂", "\\subset", !0), h(d, w, v, "⊃", "\\supset", !0), h(d, w, v, "⊆", "\\subseteq", !0), h(d, w, v, "⊇", "\\supseteq", !0), h(d, A, v, "⊈", "\\nsubseteq", !0), h(d, A, v, "⊉", "\\nsupseteq", !0), h(d, w, v, "⊨", "\\models"), h(d, w, v, "←", "\\leftarrow", !0), h(d, w, v, "≤", "\\le"), h(d, w, v, "≤", "\\leq", !0), h(d, w, v, "<", "\\lt", !0), h(d, w, v, "→", "\\rightarrow", !0), h(d, w, v, "→", "\\to"), h(d, A, v, "≱", "\\ngeq", !0), h(d, A, v, "≰", "\\nleq", !0), h(d, w, Oe, " ", "\\ "), h(d, w, Oe, " ", "\\space"), h(d, w, Oe, " ", "\\nobreakspace"), h(V, w, Oe, " ", "\\ "), h(V, w, Oe, " ", " "), h(V, w, Oe, " ", "\\space"), h(V, w, Oe, " ", "\\nobreakspace"), h(d, w, Oe, null, "\\nobreak"), h(d, w, Oe, null, "\\allowbreak"), h(d, w, le, ",", ","), h(d, w, le, ";", ";"), h(d, A, re, "⊼", "\\barwedge", !0), h(d, A, re, "⊻", "\\veebar", !0), h(d, w, re, "⊙", "\\odot", !0), h(d, w, re, "⊕", "\\oplus", !0), h(d, w, re, "⊗", "\\otimes", !0), h(d, w, E, "∂", "\\partial", !0), h(d, w, re, "⊘", "\\oslash", !0), h(d, A, re, "⊚", "\\circledcirc", !0), h(d, A, re, "⊡", "\\boxdot", !0), h(d, w, re, "△", "\\bigtriangleup"), h(d, w, re, "▽", "\\bigtriangledown"), h(d, w, re, "†", "\\dagger"), h(d, w, re, "⋄", "\\diamond"), h(d, w, re, "⋆", "\\star"), h(d, w, re, "◃", "\\triangleleft"), h(d, w, re, "▹", "\\triangleright"), h(d, w, j, "{", "\\{"), h(V, w, E, "{", "\\{"), h(V, w, E, "{", "\\textbraceleft"), h(d, w, nt, "}", "\\}"), h(V, w, E, "}", "\\}"), h(V, w, E, "}", "\\textbraceright"), h(d, w, j, "{", "\\lbrace"), h(d, w, nt, "}", "\\rbrace"), h(d, w, j, "[", "\\lbrack", !0), h(V, w, E, "[", "\\lbrack", !0), h(d, w, nt, "]", "\\rbrack", !0), h(V, w, E, "]", "\\rbrack", !0), h(d, w, j, "(", "\\lparen", !0), h(d, w, nt, ")", "\\rparen", !0), h(V, w, E, "<", "\\textless", !0), h(V, w, E, ">", "\\textgreater", !0), h(d, w, j, "⌊", "\\lfloor", !0), h(d, w, nt, "⌋", "\\rfloor", !0), h(d, w, j, "⌈", "\\lceil", !0), h(d, w, nt, "⌉", "\\rceil", !0), h(d, w, E, "\\", "\\backslash"), h(d, w, E, "∣", "|"), h(d, w, E, "∣", "\\vert"), h(V, w, E, "|", "\\textbar", !0), h(d, w, E, "∥", "\\|"), h(d, w, E, "∥", "\\Vert"), h(V, w, E, "∥", "\\textbardbl"), h(V, w, E, "~", "\\textasciitilde"), h(V, w, E, "\\", "\\textbackslash"), h(V, w, E, "^", "\\textasciicircum"), h(d, w, v, "↑", "\\uparrow", !0), h(d, w, v, "⇑", "\\Uparrow", !0), h(d, w, v, "↓", "\\downarrow", !0), h(d, w, v, "⇓", "\\Downarrow", !0), h(d, w, v, "↕", "\\updownarrow", !0), h(d, w, v, "⇕", "\\Updownarrow", !0), h(d, w, C, "∐", "\\coprod"), h(d, w, C, "⋁", "\\bigvee"), h(d, w, C, "⋀", "\\bigwedge"), h(d, w, C, "⨄", "\\biguplus"), h(d, w, C, "⋂", "\\bigcap"), h(d, w, C, "⋃", "\\bigcup"), h(d, w, C, "∫", "\\int"), h(d, w, C, "∫", "\\intop"), h(d, w, C, "∬", "\\iint"), h(d, w, C, "∭", "\\iiint"), h(d, w, C, "∏", "\\prod"), h(d, w, C, "∑", "\\sum"), h(d, w, C, "⨂", "\\bigotimes"), h(d, w, C, "⨁", "\\bigoplus"), h(d, w, C, "⨀", "\\bigodot"), h(d, w, C, "∮", "\\oint"), h(d, w, C, "∯", "\\oiint"), h(d, w, C, "∰", "\\oiiint"), h(d, w, C, "⨆", "\\bigsqcup"), h(d, w, C, "∫", "\\smallint"), h(V, w, x0, "…", "\\textellipsis"), h(d, w, x0, "…", "\\mathellipsis"), h(V, w, x0, "…", "\\ldots", !0), h(d, w, x0, "…", "\\ldots", !0), h(d, w, x0, "⋯", "\\@cdots", !0), h(d, w, x0, "⋱", "\\ddots", !0), h(d, w, E, "⋮", "\\varvdots"), h(d, w, Re, "ˊ", "\\acute"), h(d, w, Re, "ˋ", "\\grave"), h(d, w, Re, "¨", "\\ddot"), h(d, w, Re, "~", "\\tilde"), h(d, w, Re, "ˉ", "\\bar"), h(d, w, Re, "˘", "\\breve"), h(d, w, Re, "ˇ", "\\check"), h(d, w, Re, "^", "\\hat"), h(d, w, Re, "⃗", "\\vec"), h(d, w, Re, "˙", "\\dot"), h(d, w, Re, "˚", "\\mathring"), h(d, w, G, "", "\\@imath"), h(d, w, G, "", "\\@jmath"), h(d, w, E, "ı", "ı"), h(d, w, E, "ȷ", "ȷ"), h(V, w, E, "ı", "\\i", !0), h(V, w, E, "ȷ", "\\j", !0), h(V, w, E, "ß", "\\ss", !0), h(V, w, E, "æ", "\\ae", !0), h(V, w, E, "œ", "\\oe", !0), h(V, w, E, "ø", "\\o", !0), h(V, w, E, "Æ", "\\AE", !0), h(V, w, E, "Œ", "\\OE", !0), h(V, w, E, "Ø", "\\O", !0), h(V, w, Re, "ˊ", "\\'"), h(V, w, Re, "ˋ", "\\`"), h(V, w, Re, "ˆ", "\\^"), h(V, w, Re, "˜", "\\~"), h(V, w, Re, "ˉ", "\\="), h(V, w, Re, "˘", "\\u"), h(V, w, Re, "˙", "\\."), h(V, w, Re, "¸", "\\c"), h(V, w, Re, "˚", "\\r"), h(V, w, Re, "ˇ", "\\v"), h(V, w, Re, "¨", '\\"'), h(V, w, Re, "˝", "\\H"), h(V, w, Re, "◯", "\\textcircled");
+ const rt = {
+ "--": !0,
+ "---": !0,
+ "``": !0,
+ "''": !0
+ };
+ h(V, w, E, "–", "--", !0), h(V, w, E, "–", "\\textendash"), h(V, w, E, "—", "---", !0), h(V, w, E, "—", "\\textemdash"), h(V, w, E, "‘", "`", !0), h(V, w, E, "‘", "\\textquoteleft"), h(V, w, E, "’", "'", !0), h(V, w, E, "’", "\\textquoteright"), h(V, w, E, "“", "``", !0), h(V, w, E, "“", "\\textquotedblleft"), h(V, w, E, "”", "''", !0), h(V, w, E, "”", "\\textquotedblright"), h(d, w, E, "°", "\\degree", !0), h(V, w, E, "°", "\\degree"), h(V, w, E, "°", "\\textdegree", !0), h(d, w, E, "£", "\\pounds"), h(d, w, E, "£", "\\mathsterling", !0), h(V, w, E, "£", "\\pounds"), h(V, w, E, "£", "\\textsterling", !0), h(d, A, E, "✠", "\\maltese"), h(V, A, E, "✠", "\\maltese");
+ const Kt = '0123456789/@."';
+ for (let t = 0; t < Kt.length; t++) {
+ const e = Kt.charAt(t);
+ h(d, w, E, e, e);
+ }
+ const D0 = '0123456789!@*()-=+";:?/.,';
+ for (let t = 0; t < D0.length; t++) {
+ const e = D0.charAt(t);
+ h(V, w, E, e, e);
+ }
+ const Qe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ for (let t = 0; t < Qe.length; t++) {
+ const e = Qe.charAt(t);
+ h(d, w, G, e, e), h(V, w, E, e, e);
+ }
+ h(d, A, E, "C", "ℂ"), h(V, A, E, "C", "ℂ"), h(d, A, E, "H", "ℍ"), h(V, A, E, "H", "ℍ"), h(d, A, E, "N", "ℕ"), h(V, A, E, "N", "ℕ"), h(d, A, E, "P", "ℙ"), h(V, A, E, "P", "ℙ"), h(d, A, E, "Q", "ℚ"), h(V, A, E, "Q", "ℚ"), h(d, A, E, "R", "ℝ"), h(V, A, E, "R", "ℝ"), h(d, A, E, "Z", "ℤ"), h(V, A, E, "Z", "ℤ"), h(d, w, G, "h", "ℎ"), h(V, w, G, "h", "ℎ");
+ let fe = "";
+ for (let t = 0; t < Qe.length; t++) {
+ const e = Qe.charAt(t);
+ fe = String.fromCharCode(55349, 56320 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 56372 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 56424 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 56580 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 56684 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 56736 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 56788 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 56840 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 56944 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), t < 26 && (fe = String.fromCharCode(55349, 56632 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 56476 + t), h(d, w, G, e, fe), h(V, w, E, e, fe));
+ }
+ fe = "𝕜", h(d, w, G, "k", fe), h(V, w, E, "k", fe);
+ for (let t = 0; t < 10; t++) {
+ const e = t.toString();
+ fe = String.fromCharCode(55349, 57294 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 57314 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 57324 + t), h(d, w, G, e, fe), h(V, w, E, e, fe), fe = String.fromCharCode(55349, 57334 + t), h(d, w, G, e, fe), h(V, w, E, e, fe);
+ }
+ const tn = "ÐÞþ";
+ for (let t = 0; t < tn.length; t++) {
+ const e = tn.charAt(t);
+ h(d, w, G, e, e), h(V, w, E, e, e);
+ }
+ const Hn = [
+ ["mathbf", "textbf", "Main-Bold"],
+ // A-Z bold upright
+ ["mathbf", "textbf", "Main-Bold"],
+ // a-z bold upright
+ ["mathnormal", "textit", "Math-Italic"],
+ // A-Z italic
+ ["mathnormal", "textit", "Math-Italic"],
+ // a-z italic
+ ["boldsymbol", "boldsymbol", "Main-BoldItalic"],
+ // A-Z bold italic
+ ["boldsymbol", "boldsymbol", "Main-BoldItalic"],
+ // a-z bold italic
+ // Map fancy A-Z letters to script, not calligraphic.
+ // This aligns with unicode-math and math fonts (except Cambria Math).
+ ["mathscr", "textscr", "Script-Regular"],
+ // A-Z script
+ ["", "", ""],
+ // a-z script. No font
+ ["", "", ""],
+ // A-Z bold script. No font
+ ["", "", ""],
+ // a-z bold script. No font
+ ["mathfrak", "textfrak", "Fraktur-Regular"],
+ // A-Z Fraktur
+ ["mathfrak", "textfrak", "Fraktur-Regular"],
+ // a-z Fraktur
+ ["mathbb", "textbb", "AMS-Regular"],
+ // A-Z double-struck
+ ["mathbb", "textbb", "AMS-Regular"],
+ // k double-struck
+ // Note that we are using a bold font, but font metrics for regular Fraktur.
+ ["mathboldfrak", "textboldfrak", "Fraktur-Regular"],
+ // A-Z bold Fraktur
+ ["mathboldfrak", "textboldfrak", "Fraktur-Regular"],
+ // a-z bold Fraktur
+ ["mathsf", "textsf", "SansSerif-Regular"],
+ // A-Z sans-serif
+ ["mathsf", "textsf", "SansSerif-Regular"],
+ // a-z sans-serif
+ ["mathboldsf", "textboldsf", "SansSerif-Bold"],
+ // A-Z bold sans-serif
+ ["mathboldsf", "textboldsf", "SansSerif-Bold"],
+ // a-z bold sans-serif
+ ["mathitsf", "textitsf", "SansSerif-Italic"],
+ // A-Z italic sans-serif
+ ["mathitsf", "textitsf", "SansSerif-Italic"],
+ // a-z italic sans-serif
+ ["", "", ""],
+ // A-Z bold italic sans. No font
+ ["", "", ""],
+ // a-z bold italic sans. No font
+ ["mathtt", "texttt", "Typewriter-Regular"],
+ // A-Z monospace
+ ["mathtt", "texttt", "Typewriter-Regular"]
+ // a-z monospace
+ ], Js = [
+ ["mathbf", "textbf", "Main-Bold"],
+ // 0-9 bold
+ ["", "", ""],
+ // 0-9 double-struck. No KaTeX font.
+ ["mathsf", "textsf", "SansSerif-Regular"],
+ // 0-9 sans-serif
+ ["mathboldsf", "textboldsf", "SansSerif-Bold"],
+ // 0-9 bold sans-serif
+ ["mathtt", "texttt", "Typewriter-Regular"]
+ // 0-9 monospace
+ ], Xo = function(t, e) {
+ const n = t.charCodeAt(0), l = t.charCodeAt(1), c = (n - 55296) * 1024 + (l - 56320) + 65536, m = e === "math" ? 0 : 1;
+ if (119808 <= c && c < 120484) {
+ const b = Math.floor((c - 119808) / 26);
+ return [Hn[b][2], Hn[b][m]];
+ } else if (120782 <= c && c <= 120831) {
+ const b = Math.floor((c - 120782) / 10);
+ return [Js[b][2], Js[b][m]];
+ } else {
+ if (c === 120485 || c === 120486)
+ return [Hn[0][2], Hn[0][m]];
+ if (120486 < c && c < 120782)
+ return ["", ""];
+ throw new u("Unsupported character: " + t);
+ }
+ }, Un = function(t, e, n) {
+ return Le[n][t] && Le[n][t].replace && (t = Le[n][t].replace), {
+ value: t,
+ metrics: Wt(t, e, n)
+ };
+ }, Ht = function(t, e, n, l, c) {
+ const m = Un(t, e, n), b = m.metrics;
+ t = m.value;
+ let _;
+ if (b) {
+ let x = b.italic;
+ (n === "text" || l && l.font === "mathit") && (x = 0), _ = new st(t, b.height, b.depth, x, b.skew, b.width, c);
+ } else
+ typeof console < "u" && console.warn("No character metrics " + ("for '" + t + "' in style '" + e + "' and mode '" + n + "'")), _ = new st(t, 0, 0, 0, 0, 0, c);
+ if (l) {
+ _.maxFontSize = l.sizeMultiplier, l.style.isTight() && _.classes.push("mtight");
+ const x = l.getColor();
+ x && (_.style.color = x);
+ }
+ return _;
+ }, Yo = function(t, e, n, l) {
+ return l === void 0 && (l = []), n.font === "boldsymbol" && Un(t, "Main-Bold", e).metrics ? Ht(t, "Main-Bold", e, n, l.concat(["mathbf"])) : t === "\\" || Le[e][t].font === "main" ? Ht(t, "Main-Regular", e, n, l) : Ht(t, "AMS-Regular", e, n, l.concat(["amsrm"]));
+ }, Zo = function(t, e, n, l, c) {
+ return c !== "textord" && Un(t, "Math-BoldItalic", e).metrics ? {
+ fontName: "Math-BoldItalic",
+ fontClass: "boldsymbol"
+ } : {
+ fontName: "Main-Bold",
+ fontClass: "mathbf"
+ };
+ }, Ko = function(t, e, n) {
+ const l = t.mode, c = t.text, m = ["mord"], b = l === "math" || l === "text" && e.font, _ = b ? e.font : e.fontFamily;
+ let x = "", F = "";
+ if (c.charCodeAt(0) === 55349 && ([x, F] = Xo(c, l)), x.length > 0)
+ return Ht(c, x, l, e, m.concat(F));
+ if (_) {
+ let B, I;
+ if (_ === "boldsymbol") {
+ const q = Zo(c, l, e, m, n);
+ B = q.fontName, I = [q.fontClass];
+ } else
+ b ? (B = ti[_].fontName, I = [_]) : (B = Gn(_, e.fontWeight, e.fontShape), I = [_, e.fontWeight, e.fontShape]);
+ if (Un(c, B, l).metrics)
+ return Ht(c, B, l, e, m.concat(I));
+ if (rt.hasOwnProperty(c) && B.slice(0, 10) === "Typewriter") {
+ const q = [];
+ for (let W = 0; W < c.length; W++)
+ q.push(Ht(c[W], B, l, e, m.concat(I)));
+ return ei(q);
+ }
+ }
+ if (n === "mathord")
+ return Ht(c, "Math-Italic", l, e, m.concat(["mathnormal"]));
+ if (n === "textord") {
+ const B = Le[l][c] && Le[l][c].font;
+ if (B === "ams") {
+ const I = Gn("amsrm", e.fontWeight, e.fontShape);
+ return Ht(c, I, l, e, m.concat("amsrm", e.fontWeight, e.fontShape));
+ } else if (B === "main" || !B) {
+ const I = Gn("textrm", e.fontWeight, e.fontShape);
+ return Ht(c, I, l, e, m.concat(e.fontWeight, e.fontShape));
+ } else {
+ const I = Gn(B, e.fontWeight, e.fontShape);
+ return Ht(c, I, l, e, m.concat(I, e.fontWeight, e.fontShape));
+ }
+ } else
+ throw new Error("unexpected type: " + n + " in makeOrd");
+ }, Qo = (t, e) => {
+ if (Xt(t.classes) !== Xt(e.classes) || t.skew !== e.skew || t.maxFontSize !== e.maxFontSize)
+ return !1;
+ if (t.classes.length === 1) {
+ const n = t.classes[0];
+ if (n === "mbin" || n === "mord")
+ return !1;
+ }
+ for (const n in t.style)
+ if (t.style.hasOwnProperty(n) && t.style[n] !== e.style[n])
+ return !1;
+ for (const n in e.style)
+ if (e.style.hasOwnProperty(n) && t.style[n] !== e.style[n])
+ return !1;
+ return !0;
+ }, Jo = (t) => {
+ for (let e = 0; e < t.length - 1; e++) {
+ const n = t[e], l = t[e + 1];
+ n instanceof st && l instanceof st && Qo(n, l) && (n.text += l.text, n.height = Math.max(n.height, l.height), n.depth = Math.max(n.depth, l.depth), n.italic = l.italic, t.splice(e + 1, 1), e--);
+ }
+ return t;
+ }, zr = function(t) {
+ let e = 0, n = 0, l = 0;
+ for (let c = 0; c < t.children.length; c++) {
+ const m = t.children[c];
+ m.height > e && (e = m.height), m.depth > n && (n = m.depth), m.maxFontSize > l && (l = m.maxFontSize);
+ }
+ t.height = e, t.depth = n, t.maxFontSize = l;
+ }, ft = function(t, e, n, l) {
+ const c = new Ge(t, e, n, l);
+ return zr(c), c;
+ }, $s = (t, e, n, l) => new Ge(t, e, n, l), $o = function(t, e, n) {
+ const l = ft([t], [], e);
+ return l.height = Math.max(n || e.fontMetrics().defaultRuleThickness, e.minRuleThickness), l.style.borderBottomWidth = $(l.height), l.maxFontSize = 1, l;
+ }, eu = function(t, e, n, l) {
+ const c = new Yt(t, e, n, l);
+ return zr(c), c;
+ }, ei = function(t) {
+ const e = new w0(t);
+ return zr(e), e;
+ }, tu = function(t, e) {
+ return t instanceof w0 ? ft([], [t], e) : t;
+ }, nu = function(t) {
+ if (t.positionType === "individualShift") {
+ const n = t.children, l = [n[0]], c = -n[0].shift - n[0].elem.depth;
+ let m = c;
+ for (let b = 1; b < n.length; b++) {
+ const _ = -n[b].shift - m - n[b].elem.depth, x = _ - (n[b - 1].elem.height + n[b - 1].elem.depth);
+ m = m + _, l.push({
+ type: "kern",
+ size: x
+ }), l.push(n[b]);
+ }
+ return {
+ children: l,
+ depth: c
+ };
+ }
+ let e;
+ if (t.positionType === "top") {
+ let n = t.positionData;
+ for (let l = 0; l < t.children.length; l++) {
+ const c = t.children[l];
+ n -= c.type === "kern" ? c.size : c.elem.height + c.elem.depth;
+ }
+ e = n;
+ } else if (t.positionType === "bottom")
+ e = -t.positionData;
+ else {
+ const n = t.children[0];
+ if (n.type !== "elem")
+ throw new Error('First child must have type "elem".');
+ if (t.positionType === "shift")
+ e = -n.elem.depth - t.positionData;
+ else if (t.positionType === "firstBaseline")
+ e = -n.elem.depth;
+ else
+ throw new Error("Invalid positionType " + t.positionType + ".");
+ }
+ return {
+ children: t.children,
+ depth: e
+ };
+ }, ru = function(t, e) {
+ const {
+ children: n,
+ depth: l
+ } = nu(t);
+ let c = 0;
+ for (let W = 0; W < n.length; W++) {
+ const se = n[W];
+ if (se.type === "elem") {
+ const ue = se.elem;
+ c = Math.max(c, ue.maxFontSize, ue.height);
+ }
+ }
+ c += 2;
+ const m = ft(["pstrut"], []);
+ m.style.height = $(c);
+ const b = [];
+ let _ = l, x = l, F = l;
+ for (let W = 0; W < n.length; W++) {
+ const se = n[W];
+ if (se.type === "kern")
+ F += se.size;
+ else {
+ const ue = se.elem, xe = se.wrapperClasses || [], we = se.wrapperStyle || {}, De = ft(xe, [m, ue], void 0, we);
+ De.style.top = $(-c - F - ue.depth), se.marginLeft && (De.style.marginLeft = se.marginLeft), se.marginRight && (De.style.marginRight = se.marginRight), b.push(De), F += ue.height + ue.depth;
+ }
+ _ = Math.min(_, F), x = Math.max(x, F);
+ }
+ const B = ft(["vlist"], b);
+ B.style.height = $(x);
+ let I;
+ if (_ < 0) {
+ const W = ft([], []), se = ft(["vlist"], [W]);
+ se.style.height = $(-_);
+ const ue = ft(["vlist-s"], [new st("")]);
+ I = [ft(["vlist-r"], [B, ue]), ft(["vlist-r"], [se])];
+ } else
+ I = [ft(["vlist-r"], [B])];
+ const q = ft(["vlist-t"], I);
+ return I.length === 2 && q.classes.push("vlist-t2"), q.height = x, q.depth = -_, q;
+ }, su = (t, e) => {
+ const n = ft(["mspace"], [], e), l = Ne(t, e);
+ return n.style.marginRight = $(l), n;
+ }, Gn = function(t, e, n) {
+ let l = "";
+ switch (t) {
+ case "amsrm":
+ l = "AMS";
+ break;
+ case "textrm":
+ l = "Main";
+ break;
+ case "textsf":
+ l = "SansSerif";
+ break;
+ case "texttt":
+ l = "Typewriter";
+ break;
+ default:
+ l = t;
+ }
+ let c;
+ return e === "textbf" && n === "textit" ? c = "BoldItalic" : e === "textbf" ? c = "Bold" : e === "textit" ? c = "Italic" : c = "Regular", l + "-" + c;
+ }, ti = {
+ // styles
+ mathbf: {
+ variant: "bold",
+ fontName: "Main-Bold"
+ },
+ mathrm: {
+ variant: "normal",
+ fontName: "Main-Regular"
+ },
+ textit: {
+ variant: "italic",
+ fontName: "Main-Italic"
+ },
+ mathit: {
+ variant: "italic",
+ fontName: "Main-Italic"
+ },
+ mathnormal: {
+ variant: "italic",
+ fontName: "Math-Italic"
+ },
+ // "boldsymbol" is missing because they require the use of multiple fonts:
+ // Math-BoldItalic and Main-Bold. This is handled by a special case in
+ // makeOrd which ends up calling boldsymbol.
+ // families
+ mathbb: {
+ variant: "double-struck",
+ fontName: "AMS-Regular"
+ },
+ mathcal: {
+ variant: "script",
+ fontName: "Caligraphic-Regular"
+ },
+ mathfrak: {
+ variant: "fraktur",
+ fontName: "Fraktur-Regular"
+ },
+ mathscr: {
+ variant: "script",
+ fontName: "Script-Regular"
+ },
+ mathsf: {
+ variant: "sans-serif",
+ fontName: "SansSerif-Regular"
+ },
+ mathtt: {
+ variant: "monospace",
+ fontName: "Typewriter-Regular"
+ }
+ }, ni = {
+ // path, width, height
+ vec: ["vec", 0.471, 0.714],
+ // values from the font glyph
+ oiintSize1: ["oiintSize1", 0.957, 0.499],
+ // oval to overlay the integrand
+ oiintSize2: ["oiintSize2", 1.472, 0.659],
+ oiiintSize1: ["oiiintSize1", 1.304, 0.499],
+ oiiintSize2: ["oiiintSize2", 1.98, 0.659]
+ };
+ var O = {
+ fontMap: ti,
+ makeSymbol: Ht,
+ mathsym: Yo,
+ makeSpan: ft,
+ makeSvgSpan: $s,
+ makeLineSpan: $o,
+ makeAnchor: eu,
+ makeFragment: ei,
+ wrapFragment: tu,
+ makeVList: ru,
+ makeOrd: Ko,
+ makeGlue: su,
+ staticSvg: function(t, e) {
+ const [n, l, c] = ni[t], m = new Pt(n), b = new St([m], {
+ width: $(l),
+ height: $(c),
+ // Override CSS rule `.katex svg { width: 100% }`
+ style: "width:" + $(l),
+ viewBox: "0 0 " + 1e3 * l + " " + 1e3 * c,
+ preserveAspectRatio: "xMinYMin"
+ }), _ = $s(["overlay"], [b], e);
+ return _.height = c, _.style.height = $(c), _.style.width = $(l), _;
+ },
+ svgData: ni,
+ tryCombineChars: Jo
+ };
+ const We = {
+ number: 3,
+ unit: "mu"
+ }, q0 = {
+ number: 4,
+ unit: "mu"
+ }, c0 = {
+ number: 5,
+ unit: "mu"
+ }, iu = {
+ mord: {
+ mop: We,
+ mbin: q0,
+ mrel: c0,
+ minner: We
+ },
+ mop: {
+ mord: We,
+ mop: We,
+ mrel: c0,
+ minner: We
+ },
+ mbin: {
+ mord: q0,
+ mop: q0,
+ mopen: q0,
+ minner: q0
+ },
+ mrel: {
+ mord: c0,
+ mop: c0,
+ mopen: c0,
+ minner: c0
+ },
+ mopen: {},
+ mclose: {
+ mop: We,
+ mbin: q0,
+ mrel: c0,
+ minner: We
+ },
+ mpunct: {
+ mord: We,
+ mop: We,
+ mrel: c0,
+ mopen: We,
+ mclose: We,
+ mpunct: We,
+ minner: We
+ },
+ minner: {
+ mord: We,
+ mop: We,
+ mbin: q0,
+ mrel: c0,
+ mopen: We,
+ mpunct: We,
+ minner: We
+ }
+ }, lu = {
+ mord: {
+ mop: We
+ },
+ mop: {
+ mord: We,
+ mop: We
+ },
+ mbin: {},
+ mrel: {},
+ mopen: {},
+ mclose: {
+ mop: We
+ },
+ mpunct: {},
+ minner: {
+ mop: We
+ }
+ }, ri = {}, Vn = {}, Wn = {};
+ function ne(t) {
+ let {
+ type: e,
+ names: n,
+ props: l,
+ handler: c,
+ htmlBuilder: m,
+ mathmlBuilder: b
+ } = t;
+ const _ = {
+ type: e,
+ numArgs: l.numArgs,
+ argTypes: l.argTypes,
+ allowedInArgument: !!l.allowedInArgument,
+ allowedInText: !!l.allowedInText,
+ allowedInMath: l.allowedInMath === void 0 ? !0 : l.allowedInMath,
+ numOptionalArgs: l.numOptionalArgs || 0,
+ infix: !!l.infix,
+ primitive: !!l.primitive,
+ handler: c
+ };
+ for (let x = 0; x < n.length; ++x)
+ ri[n[x]] = _;
+ e && (m && (Vn[e] = m), b && (Wn[e] = b));
+ }
+ function P0(t) {
+ let {
+ type: e,
+ htmlBuilder: n,
+ mathmlBuilder: l
+ } = t;
+ ne({
+ type: e,
+ names: [],
+ props: {
+ numArgs: 0
+ },
+ handler() {
+ throw new Error("Should never be called.");
+ },
+ htmlBuilder: n,
+ mathmlBuilder: l
+ });
+ }
+ const jn = function(t) {
+ return t.type === "ordgroup" && t.body.length === 1 ? t.body[0] : t;
+ }, Ze = function(t) {
+ return t.type === "ordgroup" ? t.body : [t];
+ }, h0 = O.makeSpan, au = ["leftmost", "mbin", "mopen", "mrel", "mop", "mpunct"], ou = ["rightmost", "mrel", "mclose", "mpunct"], uu = {
+ display: ae.DISPLAY,
+ text: ae.TEXT,
+ script: ae.SCRIPT,
+ scriptscript: ae.SCRIPTSCRIPT
+ }, cu = {
+ mord: "mord",
+ mop: "mop",
+ mbin: "mbin",
+ mrel: "mrel",
+ mopen: "mopen",
+ mclose: "mclose",
+ mpunct: "mpunct",
+ minner: "minner"
+ }, Je = function(t, e, n, l) {
+ l === void 0 && (l = [null, null]);
+ const c = [];
+ for (let F = 0; F < t.length; F++) {
+ const B = ve(t[F], e);
+ if (B instanceof w0) {
+ const I = B.children;
+ c.push(...I);
+ } else
+ c.push(B);
+ }
+ if (O.tryCombineChars(c), !n)
+ return c;
+ let m = e;
+ if (t.length === 1) {
+ const F = t[0];
+ F.type === "sizing" ? m = e.havingSize(F.size) : F.type === "styling" && (m = e.havingStyle(uu[F.style]));
+ }
+ const b = h0([l[0] || "leftmost"], [], e), _ = h0([l[1] || "rightmost"], [], e), x = n === "root";
+ return Br(c, (F, B) => {
+ const I = B.classes[0], q = F.classes[0];
+ I === "mbin" && R.contains(ou, q) ? B.classes[0] = "mord" : q === "mbin" && R.contains(au, I) && (F.classes[0] = "mord");
+ }, {
+ node: b
+ }, _, x), Br(c, (F, B) => {
+ const I = Rr(B), q = Rr(F), W = I && q ? F.hasClass("mtight") ? lu[I][q] : iu[I][q] : null;
+ if (W)
+ return O.makeGlue(W, m);
+ }, {
+ node: b
+ }, _, x), c;
+ }, Br = function(t, e, n, l, c) {
+ l && t.push(l);
+ let m = 0;
+ for (; m < t.length; m++) {
+ const b = t[m], _ = si(b);
+ if (_) {
+ Br(_.children, e, n, null, c);
+ continue;
+ }
+ const x = !b.hasClass("mspace");
+ if (x) {
+ const F = e(b, n.node);
+ F && (n.insertAfter ? n.insertAfter(F) : (t.unshift(F), m++));
+ }
+ x ? n.node = b : c && b.hasClass("newline") && (n.node = h0(["leftmost"])), n.insertAfter = /* @__PURE__ */ ((F) => (B) => {
+ t.splice(F + 1, 0, B), m++;
+ })(m);
+ }
+ l && t.pop();
+ }, si = function(t) {
+ return t instanceof w0 || t instanceof Yt || t instanceof Ge && t.hasClass("enclosing") ? t : null;
+ }, Nr = function(t, e) {
+ const n = si(t);
+ if (n) {
+ const l = n.children;
+ if (l.length) {
+ if (e === "right")
+ return Nr(l[l.length - 1], "right");
+ if (e === "left")
+ return Nr(l[0], "left");
+ }
+ }
+ return t;
+ }, Rr = function(t, e) {
+ return t ? (e && (t = Nr(t, e)), cu[t.classes[0]] || null) : null;
+ }, yn = function(t, e) {
+ const n = ["nulldelimiter"].concat(t.baseSizingClasses());
+ return h0(e.concat(n));
+ }, ve = function(t, e, n) {
+ if (!t)
+ return h0();
+ if (Vn[t.type]) {
+ let l = Vn[t.type](t, e);
+ if (n && e.size !== n.size) {
+ l = h0(e.sizingClasses(n), [l], e);
+ const c = e.sizeMultiplier / n.sizeMultiplier;
+ l.height *= c, l.depth *= c;
+ }
+ return l;
+ } else
+ throw new u("Got group of unknown type: '" + t.type + "'");
+ };
+ function Xn(t, e) {
+ const n = h0(["base"], t, e), l = h0(["strut"]);
+ return l.style.height = $(n.height + n.depth), n.depth && (l.style.verticalAlign = $(-n.depth)), n.children.unshift(l), n;
+ }
+ function Ir(t, e) {
+ let n = null;
+ t.length === 1 && t[0].type === "tag" && (n = t[0].tag, t = t[0].body);
+ const l = Je(t, e, "root");
+ let c;
+ l.length === 2 && l[1].hasClass("tag") && (c = l.pop());
+ const m = [];
+ let b = [];
+ for (let F = 0; F < l.length; F++)
+ if (b.push(l[F]), l[F].hasClass("mbin") || l[F].hasClass("mrel") || l[F].hasClass("allowbreak")) {
+ let B = !1;
+ for (; F < l.length - 1 && l[F + 1].hasClass("mspace") && !l[F + 1].hasClass("newline"); )
+ F++, b.push(l[F]), l[F].hasClass("nobreak") && (B = !0);
+ B || (m.push(Xn(b, e)), b = []);
+ } else
+ l[F].hasClass("newline") && (b.pop(), b.length > 0 && (m.push(Xn(b, e)), b = []), m.push(l[F]));
+ b.length > 0 && m.push(Xn(b, e));
+ let _;
+ n ? (_ = Xn(Je(n, e, !0)), _.classes = ["tag"], m.push(_)) : c && m.push(c);
+ const x = h0(["katex-html"], m);
+ if (x.setAttribute("aria-hidden", "true"), _) {
+ const F = _.children[0];
+ F.style.height = $(x.height + x.depth), x.depth && (F.style.verticalAlign = $(-x.depth));
+ }
+ return x;
+ }
+ function ii(t) {
+ return new w0(t);
+ }
+ class Ft {
+ constructor(e, n, l) {
+ this.type = void 0, this.attributes = void 0, this.children = void 0, this.classes = void 0, this.type = e, this.attributes = {}, this.children = n || [], this.classes = l || [];
+ }
+ /**
+ * Sets an attribute on a MathML node. MathML depends on attributes to convey a
+ * semantic content, so this is used heavily.
+ */
+ setAttribute(e, n) {
+ this.attributes[e] = n;
+ }
+ /**
+ * Gets an attribute on a MathML node.
+ */
+ getAttribute(e) {
+ return this.attributes[e];
+ }
+ /**
+ * Converts the math node into a MathML-namespaced DOM element.
+ */
+ toNode() {
+ const e = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type);
+ for (const n in this.attributes)
+ Object.prototype.hasOwnProperty.call(this.attributes, n) && e.setAttribute(n, this.attributes[n]);
+ this.classes.length > 0 && (e.className = Xt(this.classes));
+ for (let n = 0; n < this.children.length; n++)
+ e.appendChild(this.children[n].toNode());
+ return e;
+ }
+ /**
+ * Converts the math node into an HTML markup string.
+ */
+ toMarkup() {
+ let e = "<" + this.type;
+ for (const n in this.attributes)
+ Object.prototype.hasOwnProperty.call(this.attributes, n) && (e += " " + n + '="', e += R.escape(this.attributes[n]), e += '"');
+ this.classes.length > 0 && (e += ' class ="' + R.escape(Xt(this.classes)) + '"'), e += ">";
+ for (let n = 0; n < this.children.length; n++)
+ e += this.children[n].toMarkup();
+ return e += "" + this.type + ">", e;
+ }
+ /**
+ * Converts the math node into a string, similar to innerText, but escaped.
+ */
+ toText() {
+ return this.children.map((e) => e.toText()).join("");
+ }
+ }
+ class _n {
+ constructor(e) {
+ this.text = void 0, this.text = e;
+ }
+ /**
+ * Converts the text node into a DOM text node.
+ */
+ toNode() {
+ return document.createTextNode(this.text);
+ }
+ /**
+ * Converts the text node into escaped HTML markup
+ * (representing the text itself).
+ */
+ toMarkup() {
+ return R.escape(this.toText());
+ }
+ /**
+ * Converts the text node into a string
+ * (representing the text itself).
+ */
+ toText() {
+ return this.text;
+ }
+ }
+ class hu {
+ /**
+ * Create a Space node with width given in CSS ems.
+ */
+ constructor(e) {
+ this.width = void 0, this.character = void 0, this.width = e, e >= 0.05555 && e <= 0.05556 ? this.character = " " : e >= 0.1666 && e <= 0.1667 ? this.character = " " : e >= 0.2222 && e <= 0.2223 ? this.character = " " : e >= 0.2777 && e <= 0.2778 ? this.character = " " : e >= -0.05556 && e <= -0.05555 ? this.character = " " : e >= -0.1667 && e <= -0.1666 ? this.character = " " : e >= -0.2223 && e <= -0.2222 ? this.character = " " : e >= -0.2778 && e <= -0.2777 ? this.character = " " : this.character = null;
+ }
+ /**
+ * Converts the math node into a MathML-namespaced DOM element.
+ */
+ toNode() {
+ if (this.character)
+ return document.createTextNode(this.character);
+ {
+ const e = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mspace");
+ return e.setAttribute("width", $(this.width)), e;
+ }
+ }
+ /**
+ * Converts the math node into an HTML markup string.
+ */
+ toMarkup() {
+ return this.character ? "" + this.character + " " : ' ';
+ }
+ /**
+ * Converts the math node into a string, similar to innerText.
+ */
+ toText() {
+ return this.character ? this.character : " ";
+ }
+ }
+ var Y = {
+ MathNode: Ft,
+ TextNode: _n,
+ SpaceNode: hu,
+ newDocumentFragment: ii
+ };
+ const Et = function(t, e, n) {
+ return Le[e][t] && Le[e][t].replace && t.charCodeAt(0) !== 55349 && !(rt.hasOwnProperty(t) && n && (n.fontFamily && n.fontFamily.slice(4, 6) === "tt" || n.font && n.font.slice(4, 6) === "tt")) && (t = Le[e][t].replace), new Y.TextNode(t);
+ }, Lr = function(t) {
+ return t.length === 1 ? t[0] : new Y.MathNode("mrow", t);
+ }, Or = function(t, e) {
+ if (e.fontFamily === "texttt")
+ return "monospace";
+ if (e.fontFamily === "textsf")
+ return e.fontShape === "textit" && e.fontWeight === "textbf" ? "sans-serif-bold-italic" : e.fontShape === "textit" ? "sans-serif-italic" : e.fontWeight === "textbf" ? "bold-sans-serif" : "sans-serif";
+ if (e.fontShape === "textit" && e.fontWeight === "textbf")
+ return "bold-italic";
+ if (e.fontShape === "textit")
+ return "italic";
+ if (e.fontWeight === "textbf")
+ return "bold";
+ const n = e.font;
+ if (!n || n === "mathnormal")
+ return null;
+ const l = t.mode;
+ if (n === "mathit")
+ return "italic";
+ if (n === "boldsymbol")
+ return t.type === "textord" ? "bold" : "bold-italic";
+ if (n === "mathbf")
+ return "bold";
+ if (n === "mathbb")
+ return "double-struck";
+ if (n === "mathfrak")
+ return "fraktur";
+ if (n === "mathscr" || n === "mathcal")
+ return "script";
+ if (n === "mathsf")
+ return "sans-serif";
+ if (n === "mathtt")
+ return "monospace";
+ let c = t.text;
+ if (R.contains(["\\imath", "\\jmath"], c))
+ return null;
+ Le[l][c] && Le[l][c].replace && (c = Le[l][c].replace);
+ const m = O.fontMap[n].fontName;
+ return Wt(c, m, l) ? O.fontMap[n].variant : null;
+ }, dt = function(t, e, n) {
+ if (t.length === 1) {
+ const m = Ie(t[0], e);
+ return n && m instanceof Ft && m.type === "mo" && (m.setAttribute("lspace", "0em"), m.setAttribute("rspace", "0em")), [m];
+ }
+ const l = [];
+ let c;
+ for (let m = 0; m < t.length; m++) {
+ const b = Ie(t[m], e);
+ if (b instanceof Ft && c instanceof Ft) {
+ if (b.type === "mtext" && c.type === "mtext" && b.getAttribute("mathvariant") === c.getAttribute("mathvariant")) {
+ c.children.push(...b.children);
+ continue;
+ } else if (b.type === "mn" && c.type === "mn") {
+ c.children.push(...b.children);
+ continue;
+ } else if (b.type === "mi" && b.children.length === 1 && c.type === "mn") {
+ const _ = b.children[0];
+ if (_ instanceof _n && _.text === ".") {
+ c.children.push(...b.children);
+ continue;
+ }
+ } else if (c.type === "mi" && c.children.length === 1) {
+ const _ = c.children[0];
+ if (_ instanceof _n && _.text === "̸" && (b.type === "mo" || b.type === "mi" || b.type === "mn")) {
+ const x = b.children[0];
+ x instanceof _n && x.text.length > 0 && (x.text = x.text.slice(0, 1) + "̸" + x.text.slice(1), l.pop());
+ }
+ }
+ }
+ l.push(b), c = b;
+ }
+ return l;
+ }, v0 = function(t, e, n) {
+ return Lr(dt(t, e, n));
+ }, Ie = function(t, e) {
+ if (!t)
+ return new Y.MathNode("mrow");
+ if (Wn[t.type])
+ return Wn[t.type](t, e);
+ throw new u("Got group of unknown type: '" + t.type + "'");
+ };
+ function li(t, e, n, l, c) {
+ const m = dt(t, n);
+ let b;
+ m.length === 1 && m[0] instanceof Ft && R.contains(["mrow", "mtable"], m[0].type) ? b = m[0] : b = new Y.MathNode("mrow", m);
+ const _ = new Y.MathNode("annotation", [new Y.TextNode(e)]);
+ _.setAttribute("encoding", "application/x-tex");
+ const x = new Y.MathNode("semantics", [b, _]), F = new Y.MathNode("math", [x]);
+ F.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"), l && F.setAttribute("display", "block");
+ const B = c ? "katex" : "katex-mathml";
+ return O.makeSpan([B], [F]);
+ }
+ const ai = function(t) {
+ return new en({
+ style: t.displayMode ? ae.DISPLAY : ae.TEXT,
+ maxSize: t.maxSize,
+ minRuleThickness: t.minRuleThickness
+ });
+ }, oi = function(t, e) {
+ if (e.displayMode) {
+ const n = ["katex-display"];
+ e.leqno && n.push("leqno"), e.fleqn && n.push("fleqn"), t = O.makeSpan(n, [t]);
+ }
+ return t;
+ }, fu = function(t, e, n) {
+ const l = ai(n);
+ let c;
+ if (n.output === "mathml")
+ return li(t, e, l, n.displayMode, !0);
+ if (n.output === "html") {
+ const m = Ir(t, l);
+ c = O.makeSpan(["katex"], [m]);
+ } else {
+ const m = li(t, e, l, n.displayMode, !1), b = Ir(t, l);
+ c = O.makeSpan(["katex"], [m, b]);
+ }
+ return oi(c, n);
+ }, du = function(t, e, n) {
+ const l = ai(n), c = Ir(t, l), m = O.makeSpan(["katex"], [c]);
+ return oi(m, n);
+ }, mu = {
+ widehat: "^",
+ widecheck: "ˇ",
+ widetilde: "~",
+ utilde: "~",
+ overleftarrow: "←",
+ underleftarrow: "←",
+ xleftarrow: "←",
+ overrightarrow: "→",
+ underrightarrow: "→",
+ xrightarrow: "→",
+ underbrace: "⏟",
+ overbrace: "⏞",
+ overgroup: "⏠",
+ undergroup: "⏡",
+ overleftrightarrow: "↔",
+ underleftrightarrow: "↔",
+ xleftrightarrow: "↔",
+ Overrightarrow: "⇒",
+ xRightarrow: "⇒",
+ overleftharpoon: "↼",
+ xleftharpoonup: "↼",
+ overrightharpoon: "⇀",
+ xrightharpoonup: "⇀",
+ xLeftarrow: "⇐",
+ xLeftrightarrow: "⇔",
+ xhookleftarrow: "↩",
+ xhookrightarrow: "↪",
+ xmapsto: "↦",
+ xrightharpoondown: "⇁",
+ xleftharpoondown: "↽",
+ xrightleftharpoons: "⇌",
+ xleftrightharpoons: "⇋",
+ xtwoheadleftarrow: "↞",
+ xtwoheadrightarrow: "↠",
+ xlongequal: "=",
+ xtofrom: "⇄",
+ xrightleftarrows: "⇄",
+ xrightequilibrium: "⇌",
+ // Not a perfect match.
+ xleftequilibrium: "⇋",
+ // None better available.
+ "\\cdrightarrow": "→",
+ "\\cdleftarrow": "←",
+ "\\cdlongequal": "="
+ }, pu = function(t) {
+ const e = new Y.MathNode("mo", [new Y.TextNode(mu[t.replace(/^\\/, "")])]);
+ return e.setAttribute("stretchy", "true"), e;
+ }, gu = {
+ // path(s), minWidth, height, align
+ overrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"],
+ overleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"],
+ underrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"],
+ underleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"],
+ xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"],
+ "\\cdrightarrow": [["rightarrow"], 3, 522, "xMaxYMin"],
+ // CD minwwidth2.5pc
+ xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"],
+ "\\cdleftarrow": [["leftarrow"], 3, 522, "xMinYMin"],
+ Overrightarrow: [["doublerightarrow"], 0.888, 560, "xMaxYMin"],
+ xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"],
+ xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"],
+ overleftharpoon: [["leftharpoon"], 0.888, 522, "xMinYMin"],
+ xleftharpoonup: [["leftharpoon"], 0.888, 522, "xMinYMin"],
+ xleftharpoondown: [["leftharpoondown"], 0.888, 522, "xMinYMin"],
+ overrightharpoon: [["rightharpoon"], 0.888, 522, "xMaxYMin"],
+ xrightharpoonup: [["rightharpoon"], 0.888, 522, "xMaxYMin"],
+ xrightharpoondown: [["rightharpoondown"], 0.888, 522, "xMaxYMin"],
+ xlongequal: [["longequal"], 0.888, 334, "xMinYMin"],
+ "\\cdlongequal": [["longequal"], 3, 334, "xMinYMin"],
+ xtwoheadleftarrow: [["twoheadleftarrow"], 0.888, 334, "xMinYMin"],
+ xtwoheadrightarrow: [["twoheadrightarrow"], 0.888, 334, "xMaxYMin"],
+ overleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522],
+ overbrace: [["leftbrace", "midbrace", "rightbrace"], 1.6, 548],
+ underbrace: [["leftbraceunder", "midbraceunder", "rightbraceunder"], 1.6, 548],
+ underleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522],
+ xleftrightarrow: [["leftarrow", "rightarrow"], 1.75, 522],
+ xLeftrightarrow: [["doubleleftarrow", "doublerightarrow"], 1.75, 560],
+ xrightleftharpoons: [["leftharpoondownplus", "rightharpoonplus"], 1.75, 716],
+ xleftrightharpoons: [["leftharpoonplus", "rightharpoondownplus"], 1.75, 716],
+ xhookleftarrow: [["leftarrow", "righthook"], 1.08, 522],
+ xhookrightarrow: [["lefthook", "rightarrow"], 1.08, 522],
+ overlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522],
+ underlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522],
+ overgroup: [["leftgroup", "rightgroup"], 0.888, 342],
+ undergroup: [["leftgroupunder", "rightgroupunder"], 0.888, 342],
+ xmapsto: [["leftmapsto", "rightarrow"], 1.5, 522],
+ xtofrom: [["leftToFrom", "rightToFrom"], 1.75, 528],
+ // The next three arrows are from the mhchem package.
+ // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the
+ // document as \xrightarrow or \xrightleftharpoons. Those have
+ // min-length = 1.75em, so we set min-length on these next three to match.
+ xrightleftarrows: [["baraboveleftarrow", "rightarrowabovebar"], 1.75, 901],
+ xrightequilibrium: [["baraboveshortleftharpoon", "rightharpoonaboveshortbar"], 1.75, 716],
+ xleftequilibrium: [["shortbaraboveleftharpoon", "shortrightharpoonabovebar"], 1.75, 716]
+ }, bu = function(t) {
+ return t.type === "ordgroup" ? t.body.length : 1;
+ };
+ var f0 = {
+ encloseSpan: function(t, e, n, l, c) {
+ let m;
+ const b = t.height + t.depth + n + l;
+ if (/fbox|color|angl/.test(e)) {
+ if (m = O.makeSpan(["stretchy", e], [], c), e === "fbox") {
+ const _ = c.color && c.getColor();
+ _ && (m.style.borderColor = _);
+ }
+ } else {
+ const _ = [];
+ /^[bx]cancel$/.test(e) && _.push(new bn({
+ x1: "0",
+ y1: "0",
+ x2: "100%",
+ y2: "100%",
+ "stroke-width": "0.046em"
+ })), /^x?cancel$/.test(e) && _.push(new bn({
+ x1: "0",
+ y1: "100%",
+ x2: "100%",
+ y2: "0",
+ "stroke-width": "0.046em"
+ }));
+ const x = new St(_, {
+ width: "100%",
+ height: $(b)
+ });
+ m = O.makeSvgSpan([], [x], c);
+ }
+ return m.height = b, m.style.height = $(b), m;
+ },
+ mathMLnode: pu,
+ svgSpan: function(t, e) {
+ function n() {
+ let b = 4e5;
+ const _ = t.label.slice(1);
+ if (R.contains(["widehat", "widecheck", "widetilde", "utilde"], _)) {
+ const F = bu(t.base);
+ let B, I, q;
+ if (F > 5)
+ _ === "widehat" || _ === "widecheck" ? (B = 420, b = 2364, q = 0.42, I = _ + "4") : (B = 312, b = 2340, q = 0.34, I = "tilde4");
+ else {
+ const ue = [1, 1, 2, 2, 3, 3][F];
+ _ === "widehat" || _ === "widecheck" ? (b = [0, 1062, 2364, 2364, 2364][ue], B = [0, 239, 300, 360, 420][ue], q = [0, 0.24, 0.3, 0.3, 0.36, 0.42][ue], I = _ + ue) : (b = [0, 600, 1033, 2339, 2340][ue], B = [0, 260, 286, 306, 312][ue], q = [0, 0.26, 0.286, 0.3, 0.306, 0.34][ue], I = "tilde" + ue);
+ }
+ const W = new Pt(I), se = new St([W], {
+ width: "100%",
+ height: $(q),
+ viewBox: "0 0 " + b + " " + B,
+ preserveAspectRatio: "none"
+ });
+ return {
+ span: O.makeSvgSpan([], [se], e),
+ minWidth: 0,
+ height: q
+ };
+ } else {
+ const x = [], F = gu[_], [B, I, q] = F, W = q / 1e3, se = B.length;
+ let ue, xe;
+ if (se === 1) {
+ const we = F[3];
+ ue = ["hide-tail"], xe = [we];
+ } else if (se === 2)
+ ue = ["halfarrow-left", "halfarrow-right"], xe = ["xMinYMin", "xMaxYMin"];
+ else if (se === 3)
+ ue = ["brace-left", "brace-center", "brace-right"], xe = ["xMinYMin", "xMidYMin", "xMaxYMin"];
+ else
+ throw new Error(`Correct katexImagesData or update code here to support
+ ` + se + " children.");
+ for (let we = 0; we < se; we++) {
+ const De = new Pt(B[we]), Fe = new St([De], {
+ width: "400em",
+ height: $(W),
+ viewBox: "0 0 " + b + " " + q,
+ preserveAspectRatio: xe[we] + " slice"
+ }), qe = O.makeSvgSpan([ue[we]], [Fe], e);
+ if (se === 1)
+ return {
+ span: qe,
+ minWidth: I,
+ height: W
+ };
+ qe.style.height = $(W), x.push(qe);
+ }
+ return {
+ span: O.makeSpan(["stretchy"], x, e),
+ minWidth: I,
+ height: W
+ };
+ }
+ }
+ const {
+ span: l,
+ minWidth: c,
+ height: m
+ } = n();
+ return l.height = m, l.style.height = $(m), c > 0 && (l.style.minWidth = $(c)), l;
+ }
+ };
+ function pe(t, e) {
+ if (!t || t.type !== e)
+ throw new Error("Expected node of type " + e + ", but got " + (t ? "node of type " + t.type : String(t)));
+ return t;
+ }
+ function qr(t) {
+ const e = Yn(t);
+ if (!e)
+ throw new Error("Expected node of symbol group type, but got " + (t ? "node of type " + t.type : String(t)));
+ return e;
+ }
+ function Yn(t) {
+ return t && (t.type === "atom" || Zt.hasOwnProperty(t.type)) ? t : null;
+ }
+ const Pr = (t, e) => {
+ let n, l, c;
+ t && t.type === "supsub" ? (l = pe(t.base, "accent"), n = l.base, t.base = n, c = Pn(ve(t, e)), t.base = l) : (l = pe(t, "accent"), n = l.base);
+ const m = ve(n, e.havingCrampedStyle()), b = l.isShifty && R.isCharacterBox(n);
+ let _ = 0;
+ if (b) {
+ const q = R.getBaseElem(n), W = ve(q, e.havingCrampedStyle());
+ _ = wn(W).skew;
+ }
+ const x = l.label === "\\c";
+ let F = x ? m.height + m.depth : Math.min(m.height, e.fontMetrics().xHeight), B;
+ if (l.isStretchy)
+ B = f0.svgSpan(l, e), B = O.makeVList({
+ positionType: "firstBaseline",
+ children: [{
+ type: "elem",
+ elem: m
+ }, {
+ type: "elem",
+ elem: B,
+ wrapperClasses: ["svg-align"],
+ wrapperStyle: _ > 0 ? {
+ width: "calc(100% - " + $(2 * _) + ")",
+ marginLeft: $(2 * _)
+ } : void 0
+ }]
+ }, e);
+ else {
+ let q, W;
+ l.label === "\\vec" ? (q = O.staticSvg("vec", e), W = O.svgData.vec[1]) : (q = O.makeOrd({
+ mode: l.mode,
+ text: l.label
+ }, e, "textord"), q = wn(q), q.italic = 0, W = q.width, x && (F += q.depth)), B = O.makeSpan(["accent-body"], [q]);
+ const se = l.label === "\\textcircled";
+ se && (B.classes.push("accent-full"), F = m.height);
+ let ue = _;
+ se || (ue -= W / 2), B.style.left = $(ue), l.label === "\\textcircled" && (B.style.top = ".2em"), B = O.makeVList({
+ positionType: "firstBaseline",
+ children: [{
+ type: "elem",
+ elem: m
+ }, {
+ type: "kern",
+ size: -F
+ }, {
+ type: "elem",
+ elem: B
+ }]
+ }, e);
+ }
+ const I = O.makeSpan(["mord", "accent"], [B], e);
+ return c ? (c.children[0] = I, c.height = Math.max(I.height, c.height), c.classes[0] = "mord", c) : I;
+ }, ui = (t, e) => {
+ const n = t.isStretchy ? f0.mathMLnode(t.label) : new Y.MathNode("mo", [Et(t.label, t.mode)]), l = new Y.MathNode("mover", [Ie(t.base, e), n]);
+ return l.setAttribute("accent", "true"), l;
+ }, wu = new RegExp(["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring"].map((t) => "\\" + t).join("|"));
+ ne({
+ type: "accent",
+ names: ["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring", "\\widecheck", "\\widehat", "\\widetilde", "\\overrightarrow", "\\overleftarrow", "\\Overrightarrow", "\\overleftrightarrow", "\\overgroup", "\\overlinesegment", "\\overleftharpoon", "\\overrightharpoon"],
+ props: {
+ numArgs: 1
+ },
+ handler: (t, e) => {
+ const n = jn(e[0]), l = !wu.test(t.funcName), c = !l || t.funcName === "\\widehat" || t.funcName === "\\widetilde" || t.funcName === "\\widecheck";
+ return {
+ type: "accent",
+ mode: t.parser.mode,
+ label: t.funcName,
+ isStretchy: l,
+ isShifty: c,
+ base: n
+ };
+ },
+ htmlBuilder: Pr,
+ mathmlBuilder: ui
+ }), ne({
+ type: "accent",
+ names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\c", "\\r", "\\H", "\\v", "\\textcircled"],
+ props: {
+ numArgs: 1,
+ allowedInText: !0,
+ allowedInMath: !0,
+ // unless in strict mode
+ argTypes: ["primitive"]
+ },
+ handler: (t, e) => {
+ const n = e[0];
+ let l = t.parser.mode;
+ return l === "math" && (t.parser.settings.reportNonstrict("mathVsTextAccents", "LaTeX's accent " + t.funcName + " works only in text mode"), l = "text"), {
+ type: "accent",
+ mode: l,
+ label: t.funcName,
+ isStretchy: !1,
+ isShifty: !0,
+ base: n
+ };
+ },
+ htmlBuilder: Pr,
+ mathmlBuilder: ui
+ }), ne({
+ type: "accentUnder",
+ names: ["\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", "\\undergroup", "\\underlinesegment", "\\utilde"],
+ props: {
+ numArgs: 1
+ },
+ handler: (t, e) => {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = e[0];
+ return {
+ type: "accentUnder",
+ mode: n.mode,
+ label: l,
+ base: c
+ };
+ },
+ htmlBuilder: (t, e) => {
+ const n = ve(t.base, e), l = f0.svgSpan(t, e), c = t.label === "\\utilde" ? 0.12 : 0, m = O.makeVList({
+ positionType: "top",
+ positionData: n.height,
+ children: [{
+ type: "elem",
+ elem: l,
+ wrapperClasses: ["svg-align"]
+ }, {
+ type: "kern",
+ size: c
+ }, {
+ type: "elem",
+ elem: n
+ }]
+ }, e);
+ return O.makeSpan(["mord", "accentunder"], [m], e);
+ },
+ mathmlBuilder: (t, e) => {
+ const n = f0.mathMLnode(t.label), l = new Y.MathNode("munder", [Ie(t.base, e), n]);
+ return l.setAttribute("accentunder", "true"), l;
+ }
+ });
+ const Zn = (t) => {
+ const e = new Y.MathNode("mpadded", t ? [t] : []);
+ return e.setAttribute("width", "+0.6em"), e.setAttribute("lspace", "0.3em"), e;
+ };
+ ne({
+ type: "xArrow",
+ names: [
+ "\\xleftarrow",
+ "\\xrightarrow",
+ "\\xLeftarrow",
+ "\\xRightarrow",
+ "\\xleftrightarrow",
+ "\\xLeftrightarrow",
+ "\\xhookleftarrow",
+ "\\xhookrightarrow",
+ "\\xmapsto",
+ "\\xrightharpoondown",
+ "\\xrightharpoonup",
+ "\\xleftharpoondown",
+ "\\xleftharpoonup",
+ "\\xrightleftharpoons",
+ "\\xleftrightharpoons",
+ "\\xlongequal",
+ "\\xtwoheadrightarrow",
+ "\\xtwoheadleftarrow",
+ "\\xtofrom",
+ // The next 3 functions are here to support the mhchem extension.
+ // Direct use of these functions is discouraged and may break someday.
+ "\\xrightleftarrows",
+ "\\xrightequilibrium",
+ "\\xleftequilibrium",
+ // The next 3 functions are here only to support the {CD} environment.
+ "\\\\cdrightarrow",
+ "\\\\cdleftarrow",
+ "\\\\cdlongequal"
+ ],
+ props: {
+ numArgs: 1,
+ numOptionalArgs: 1
+ },
+ handler(t, e, n) {
+ let {
+ parser: l,
+ funcName: c
+ } = t;
+ return {
+ type: "xArrow",
+ mode: l.mode,
+ label: c,
+ body: e[0],
+ below: n[0]
+ };
+ },
+ // Flow is unable to correctly infer the type of `group`, even though it's
+ // unambiguously determined from the passed-in `type` above.
+ htmlBuilder(t, e) {
+ const n = e.style;
+ let l = e.havingStyle(n.sup());
+ const c = O.wrapFragment(ve(t.body, l, e), e), m = t.label.slice(0, 2) === "\\x" ? "x" : "cd";
+ c.classes.push(m + "-arrow-pad");
+ let b;
+ t.below && (l = e.havingStyle(n.sub()), b = O.wrapFragment(ve(t.below, l, e), e), b.classes.push(m + "-arrow-pad"));
+ const _ = f0.svgSpan(t, e), x = -e.fontMetrics().axisHeight + 0.5 * _.height;
+ let F = -e.fontMetrics().axisHeight - 0.5 * _.height - 0.111;
+ (c.depth > 0.25 || t.label === "\\xleftequilibrium") && (F -= c.depth);
+ let B;
+ if (b) {
+ const I = -e.fontMetrics().axisHeight + b.height + 0.5 * _.height + 0.111;
+ B = O.makeVList({
+ positionType: "individualShift",
+ children: [{
+ type: "elem",
+ elem: c,
+ shift: F
+ }, {
+ type: "elem",
+ elem: _,
+ shift: x
+ }, {
+ type: "elem",
+ elem: b,
+ shift: I
+ }]
+ }, e);
+ } else
+ B = O.makeVList({
+ positionType: "individualShift",
+ children: [{
+ type: "elem",
+ elem: c,
+ shift: F
+ }, {
+ type: "elem",
+ elem: _,
+ shift: x
+ }]
+ }, e);
+ return B.children[0].children[0].children[1].classes.push("svg-align"), O.makeSpan(["mrel", "x-arrow"], [B], e);
+ },
+ mathmlBuilder(t, e) {
+ const n = f0.mathMLnode(t.label);
+ n.setAttribute("minsize", t.label.charAt(0) === "x" ? "1.75em" : "3.0em");
+ let l;
+ if (t.body) {
+ const c = Zn(Ie(t.body, e));
+ if (t.below) {
+ const m = Zn(Ie(t.below, e));
+ l = new Y.MathNode("munderover", [n, m, c]);
+ } else
+ l = new Y.MathNode("mover", [n, c]);
+ } else if (t.below) {
+ const c = Zn(Ie(t.below, e));
+ l = new Y.MathNode("munder", [n, c]);
+ } else
+ l = Zn(), l = new Y.MathNode("mover", [n, l]);
+ return l;
+ }
+ });
+ const yu = O.makeSpan;
+ function ci(t, e) {
+ const n = Je(t.body, e, !0);
+ return yu([t.mclass], n, e);
+ }
+ function hi(t, e) {
+ let n;
+ const l = dt(t.body, e);
+ return t.mclass === "minner" ? n = new Y.MathNode("mpadded", l) : t.mclass === "mord" ? t.isCharacterBox ? (n = l[0], n.type = "mi") : n = new Y.MathNode("mi", l) : (t.isCharacterBox ? (n = l[0], n.type = "mo") : n = new Y.MathNode("mo", l), t.mclass === "mbin" ? (n.attributes.lspace = "0.22em", n.attributes.rspace = "0.22em") : t.mclass === "mpunct" ? (n.attributes.lspace = "0em", n.attributes.rspace = "0.17em") : t.mclass === "mopen" || t.mclass === "mclose" ? (n.attributes.lspace = "0em", n.attributes.rspace = "0em") : t.mclass === "minner" && (n.attributes.lspace = "0.0556em", n.attributes.width = "+0.1111em")), n;
+ }
+ ne({
+ type: "mclass",
+ names: ["\\mathord", "\\mathbin", "\\mathrel", "\\mathopen", "\\mathclose", "\\mathpunct", "\\mathinner"],
+ props: {
+ numArgs: 1,
+ primitive: !0
+ },
+ handler(t, e) {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = e[0];
+ return {
+ type: "mclass",
+ mode: n.mode,
+ mclass: "m" + l.slice(5),
+ // TODO(kevinb): don't prefix with 'm'
+ body: Ze(c),
+ isCharacterBox: R.isCharacterBox(c)
+ };
+ },
+ htmlBuilder: ci,
+ mathmlBuilder: hi
+ });
+ const Kn = (t) => {
+ const e = t.type === "ordgroup" && t.body.length ? t.body[0] : t;
+ return e.type === "atom" && (e.family === "bin" || e.family === "rel") ? "m" + e.family : "mord";
+ };
+ ne({
+ type: "mclass",
+ names: ["\\@binrel"],
+ props: {
+ numArgs: 2
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ return {
+ type: "mclass",
+ mode: n.mode,
+ mclass: Kn(e[0]),
+ body: Ze(e[1]),
+ isCharacterBox: R.isCharacterBox(e[1])
+ };
+ }
+ }), ne({
+ type: "mclass",
+ names: ["\\stackrel", "\\overset", "\\underset"],
+ props: {
+ numArgs: 2
+ },
+ handler(t, e) {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = e[1], m = e[0];
+ let b;
+ l !== "\\stackrel" ? b = Kn(c) : b = "mrel";
+ const _ = {
+ type: "op",
+ mode: c.mode,
+ limits: !0,
+ alwaysHandleSupSub: !0,
+ parentIsSupSub: !1,
+ symbol: !1,
+ suppressBaseShift: l !== "\\stackrel",
+ body: Ze(c)
+ }, x = {
+ type: "supsub",
+ mode: m.mode,
+ base: _,
+ sup: l === "\\underset" ? null : m,
+ sub: l === "\\underset" ? m : null
+ };
+ return {
+ type: "mclass",
+ mode: n.mode,
+ mclass: b,
+ body: [x],
+ isCharacterBox: R.isCharacterBox(x)
+ };
+ },
+ htmlBuilder: ci,
+ mathmlBuilder: hi
+ }), ne({
+ type: "pmb",
+ names: ["\\pmb"],
+ props: {
+ numArgs: 1,
+ allowedInText: !0
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ return {
+ type: "pmb",
+ mode: n.mode,
+ mclass: Kn(e[0]),
+ body: Ze(e[0])
+ };
+ },
+ htmlBuilder(t, e) {
+ const n = Je(t.body, e, !0), l = O.makeSpan([t.mclass], n, e);
+ return l.style.textShadow = "0.02em 0.01em 0.04px", l;
+ },
+ mathmlBuilder(t, e) {
+ const n = dt(t.body, e), l = new Y.MathNode("mstyle", n);
+ return l.setAttribute("style", "text-shadow: 0.02em 0.01em 0.04px"), l;
+ }
+ });
+ const _u = {
+ ">": "\\\\cdrightarrow",
+ "<": "\\\\cdleftarrow",
+ "=": "\\\\cdlongequal",
+ A: "\\uparrow",
+ V: "\\downarrow",
+ "|": "\\Vert",
+ ".": "no arrow"
+ }, fi = () => ({
+ type: "styling",
+ body: [],
+ mode: "math",
+ style: "display"
+ }), di = (t) => t.type === "textord" && t.text === "@", ku = (t, e) => (t.type === "mathord" || t.type === "atom") && t.text === e;
+ function xu(t, e, n) {
+ const l = _u[t];
+ switch (l) {
+ case "\\\\cdrightarrow":
+ case "\\\\cdleftarrow":
+ return n.callFunction(l, [e[0]], [e[1]]);
+ case "\\uparrow":
+ case "\\downarrow": {
+ const c = n.callFunction("\\\\cdleft", [e[0]], []), m = {
+ type: "atom",
+ text: l,
+ mode: "math",
+ family: "rel"
+ }, b = n.callFunction("\\Big", [m], []), _ = n.callFunction("\\\\cdright", [e[1]], []), x = {
+ type: "ordgroup",
+ mode: "math",
+ body: [c, b, _]
+ };
+ return n.callFunction("\\\\cdparent", [x], []);
+ }
+ case "\\\\cdlongequal":
+ return n.callFunction("\\\\cdlongequal", [], []);
+ case "\\Vert": {
+ const c = {
+ type: "textord",
+ text: "\\Vert",
+ mode: "math"
+ };
+ return n.callFunction("\\Big", [c], []);
+ }
+ default:
+ return {
+ type: "textord",
+ text: " ",
+ mode: "math"
+ };
+ }
+ }
+ function Du(t) {
+ const e = [];
+ for (t.gullet.beginGroup(), t.gullet.macros.set("\\cr", "\\\\\\relax"), t.gullet.beginGroup(); ; ) {
+ e.push(t.parseExpression(!1, "\\\\")), t.gullet.endGroup(), t.gullet.beginGroup();
+ const m = t.fetch().text;
+ if (m === "&" || m === "\\\\")
+ t.consume();
+ else if (m === "\\end") {
+ e[e.length - 1].length === 0 && e.pop();
+ break;
+ } else
+ throw new u("Expected \\\\ or \\cr or \\end", t.nextToken);
+ }
+ let n = [];
+ const l = [n];
+ for (let m = 0; m < e.length; m++) {
+ const b = e[m];
+ let _ = fi();
+ for (let x = 0; x < b.length; x++)
+ if (!di(b[x]))
+ _.body.push(b[x]);
+ else {
+ n.push(_), x += 1;
+ const F = qr(b[x]).text, B = new Array(2);
+ if (B[0] = {
+ type: "ordgroup",
+ mode: "math",
+ body: []
+ }, B[1] = {
+ type: "ordgroup",
+ mode: "math",
+ body: []
+ }, !("=|.".indexOf(F) > -1))
+ if ("<>AV".indexOf(F) > -1)
+ for (let W = 0; W < 2; W++) {
+ let se = !0;
+ for (let ue = x + 1; ue < b.length; ue++) {
+ if (ku(b[ue], F)) {
+ se = !1, x = ue;
+ break;
+ }
+ if (di(b[ue]))
+ throw new u("Missing a " + F + " character to complete a CD arrow.", b[ue]);
+ B[W].body.push(b[ue]);
+ }
+ if (se)
+ throw new u("Missing a " + F + " character to complete a CD arrow.", b[x]);
+ }
+ else
+ throw new u('Expected one of "<>AV=|." after @', b[x]);
+ const q = {
+ type: "styling",
+ body: [xu(F, B, t)],
+ mode: "math",
+ style: "display"
+ // CD is always displaystyle.
+ };
+ n.push(q), _ = fi();
+ }
+ m % 2 === 0 ? n.push(_) : n.shift(), n = [], l.push(n);
+ }
+ t.gullet.endGroup(), t.gullet.endGroup();
+ const c = new Array(l[0].length).fill({
+ type: "align",
+ align: "c",
+ pregap: 0.25,
+ // CD package sets \enskip between columns.
+ postgap: 0.25
+ // So pre and post each get half an \enskip, i.e. 0.25em.
+ });
+ return {
+ type: "array",
+ mode: "math",
+ body: l,
+ arraystretch: 1,
+ addJot: !0,
+ rowGaps: [null],
+ cols: c,
+ colSeparationType: "CD",
+ hLinesBeforeRow: new Array(l.length + 1).fill([])
+ };
+ }
+ ne({
+ type: "cdlabel",
+ names: ["\\\\cdleft", "\\\\cdright"],
+ props: {
+ numArgs: 1
+ },
+ handler(t, e) {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ return {
+ type: "cdlabel",
+ mode: n.mode,
+ side: l.slice(4),
+ label: e[0]
+ };
+ },
+ htmlBuilder(t, e) {
+ const n = e.havingStyle(e.style.sup()), l = O.wrapFragment(ve(t.label, n, e), e);
+ return l.classes.push("cd-label-" + t.side), l.style.bottom = $(0.8 - l.depth), l.height = 0, l.depth = 0, l;
+ },
+ mathmlBuilder(t, e) {
+ let n = new Y.MathNode("mrow", [Ie(t.label, e)]);
+ return n = new Y.MathNode("mpadded", [n]), n.setAttribute("width", "0"), t.side === "left" && n.setAttribute("lspace", "-1width"), n.setAttribute("voffset", "0.7em"), n = new Y.MathNode("mstyle", [n]), n.setAttribute("displaystyle", "false"), n.setAttribute("scriptlevel", "1"), n;
+ }
+ }), ne({
+ type: "cdlabelparent",
+ names: ["\\\\cdparent"],
+ props: {
+ numArgs: 1
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ return {
+ type: "cdlabelparent",
+ mode: n.mode,
+ fragment: e[0]
+ };
+ },
+ htmlBuilder(t, e) {
+ const n = O.wrapFragment(ve(t.fragment, e), e);
+ return n.classes.push("cd-vert-arrow"), n;
+ },
+ mathmlBuilder(t, e) {
+ return new Y.MathNode("mrow", [Ie(t.fragment, e)]);
+ }
+ }), ne({
+ type: "textord",
+ names: ["\\@char"],
+ props: {
+ numArgs: 1,
+ allowedInText: !0
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ const c = pe(e[0], "ordgroup").body;
+ let m = "";
+ for (let x = 0; x < c.length; x++) {
+ const F = pe(c[x], "textord");
+ m += F.text;
+ }
+ let b = parseInt(m), _;
+ if (isNaN(b))
+ throw new u("\\@char has non-numeric argument " + m);
+ if (b < 0 || b >= 1114111)
+ throw new u("\\@char with invalid code point " + m);
+ return b <= 65535 ? _ = String.fromCharCode(b) : (b -= 65536, _ = String.fromCharCode((b >> 10) + 55296, (b & 1023) + 56320)), {
+ type: "textord",
+ mode: n.mode,
+ text: _
+ };
+ }
+ });
+ const mi = (t, e) => {
+ const n = Je(t.body, e.withColor(t.color), !1);
+ return O.makeFragment(n);
+ }, pi = (t, e) => {
+ const n = dt(t.body, e.withColor(t.color)), l = new Y.MathNode("mstyle", n);
+ return l.setAttribute("mathcolor", t.color), l;
+ };
+ ne({
+ type: "color",
+ names: ["\\textcolor"],
+ props: {
+ numArgs: 2,
+ allowedInText: !0,
+ argTypes: ["color", "original"]
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ const l = pe(e[0], "color-token").color, c = e[1];
+ return {
+ type: "color",
+ mode: n.mode,
+ color: l,
+ body: Ze(c)
+ };
+ },
+ htmlBuilder: mi,
+ mathmlBuilder: pi
+ }), ne({
+ type: "color",
+ names: ["\\color"],
+ props: {
+ numArgs: 1,
+ allowedInText: !0,
+ argTypes: ["color"]
+ },
+ handler(t, e) {
+ let {
+ parser: n,
+ breakOnTokenText: l
+ } = t;
+ const c = pe(e[0], "color-token").color;
+ n.gullet.macros.set("\\current@color", c);
+ const m = n.parseExpression(!0, l);
+ return {
+ type: "color",
+ mode: n.mode,
+ color: c,
+ body: m
+ };
+ },
+ htmlBuilder: mi,
+ mathmlBuilder: pi
+ }), ne({
+ type: "cr",
+ names: ["\\\\"],
+ props: {
+ numArgs: 0,
+ numOptionalArgs: 0,
+ allowedInText: !0
+ },
+ handler(t, e, n) {
+ let {
+ parser: l
+ } = t;
+ const c = l.gullet.future().text === "[" ? l.parseSizeGroup(!0) : null, m = !l.settings.displayMode || !l.settings.useStrictBehavior("newLineInDisplayMode", "In LaTeX, \\\\ or \\newline does nothing in display mode");
+ return {
+ type: "cr",
+ mode: l.mode,
+ newLine: m,
+ size: c && pe(c, "size").value
+ };
+ },
+ // The following builders are called only at the top level,
+ // not within tabular/array environments.
+ htmlBuilder(t, e) {
+ const n = O.makeSpan(["mspace"], [], e);
+ return t.newLine && (n.classes.push("newline"), t.size && (n.style.marginTop = $(Ne(t.size, e)))), n;
+ },
+ mathmlBuilder(t, e) {
+ const n = new Y.MathNode("mspace");
+ return t.newLine && (n.setAttribute("linebreak", "newline"), t.size && n.setAttribute("height", $(Ne(t.size, e)))), n;
+ }
+ });
+ const Hr = {
+ "\\global": "\\global",
+ "\\long": "\\\\globallong",
+ "\\\\globallong": "\\\\globallong",
+ "\\def": "\\gdef",
+ "\\gdef": "\\gdef",
+ "\\edef": "\\xdef",
+ "\\xdef": "\\xdef",
+ "\\let": "\\\\globallet",
+ "\\futurelet": "\\\\globalfuture"
+ }, gi = (t) => {
+ const e = t.text;
+ if (/^(?:[\\{}$^_]|EOF)$/.test(e))
+ throw new u("Expected a control sequence", t);
+ return e;
+ }, vu = (t) => {
+ let e = t.gullet.popToken();
+ return e.text === "=" && (e = t.gullet.popToken(), e.text === " " && (e = t.gullet.popToken())), e;
+ }, bi = (t, e, n, l) => {
+ let c = t.gullet.macros.get(n.text);
+ c == null && (n.noexpand = !0, c = {
+ tokens: [n],
+ numArgs: 0,
+ // reproduce the same behavior in expansion
+ unexpandable: !t.gullet.isExpandable(n.text)
+ }), t.gullet.macros.set(e, c, l);
+ };
+ ne({
+ type: "internal",
+ names: [
+ "\\global",
+ "\\long",
+ "\\\\globallong"
+ // can’t be entered directly
+ ],
+ props: {
+ numArgs: 0,
+ allowedInText: !0
+ },
+ handler(t) {
+ let {
+ parser: e,
+ funcName: n
+ } = t;
+ e.consumeSpaces();
+ const l = e.fetch();
+ if (Hr[l.text])
+ return (n === "\\global" || n === "\\\\globallong") && (l.text = Hr[l.text]), pe(e.parseFunction(), "internal");
+ throw new u("Invalid token after macro prefix", l);
+ }
+ }), ne({
+ type: "internal",
+ names: ["\\def", "\\gdef", "\\edef", "\\xdef"],
+ props: {
+ numArgs: 0,
+ allowedInText: !0,
+ primitive: !0
+ },
+ handler(t) {
+ let {
+ parser: e,
+ funcName: n
+ } = t, l = e.gullet.popToken();
+ const c = l.text;
+ if (/^(?:[\\{}$^_]|EOF)$/.test(c))
+ throw new u("Expected a control sequence", l);
+ let m = 0, b;
+ const _ = [[]];
+ for (; e.gullet.future().text !== "{"; )
+ if (l = e.gullet.popToken(), l.text === "#") {
+ if (e.gullet.future().text === "{") {
+ b = e.gullet.future(), _[m].push("{");
+ break;
+ }
+ if (l = e.gullet.popToken(), !/^[1-9]$/.test(l.text))
+ throw new u('Invalid argument number "' + l.text + '"');
+ if (parseInt(l.text) !== m + 1)
+ throw new u('Argument number "' + l.text + '" out of order');
+ m++, _.push([]);
+ } else {
+ if (l.text === "EOF")
+ throw new u("Expected a macro definition");
+ _[m].push(l.text);
+ }
+ let {
+ tokens: x
+ } = e.gullet.consumeArg();
+ return b && x.unshift(b), (n === "\\edef" || n === "\\xdef") && (x = e.gullet.expandTokens(x), x.reverse()), e.gullet.macros.set(c, {
+ tokens: x,
+ numArgs: m,
+ delimiters: _
+ }, n === Hr[n]), {
+ type: "internal",
+ mode: e.mode
+ };
+ }
+ }), ne({
+ type: "internal",
+ names: [
+ "\\let",
+ "\\\\globallet"
+ // can’t be entered directly
+ ],
+ props: {
+ numArgs: 0,
+ allowedInText: !0,
+ primitive: !0
+ },
+ handler(t) {
+ let {
+ parser: e,
+ funcName: n
+ } = t;
+ const l = gi(e.gullet.popToken());
+ e.gullet.consumeSpaces();
+ const c = vu(e);
+ return bi(e, l, c, n === "\\\\globallet"), {
+ type: "internal",
+ mode: e.mode
+ };
+ }
+ }), ne({
+ type: "internal",
+ names: [
+ "\\futurelet",
+ "\\\\globalfuture"
+ // can’t be entered directly
+ ],
+ props: {
+ numArgs: 0,
+ allowedInText: !0,
+ primitive: !0
+ },
+ handler(t) {
+ let {
+ parser: e,
+ funcName: n
+ } = t;
+ const l = gi(e.gullet.popToken()), c = e.gullet.popToken(), m = e.gullet.popToken();
+ return bi(e, l, m, n === "\\\\globalfuture"), e.gullet.pushToken(m), e.gullet.pushToken(c), {
+ type: "internal",
+ mode: e.mode
+ };
+ }
+ });
+ const kn = function(t, e, n) {
+ const l = Le.math[t] && Le.math[t].replace, c = Wt(l || t, e, n);
+ if (!c)
+ throw new Error("Unsupported symbol " + t + " and font size " + e + ".");
+ return c;
+ }, Ur = function(t, e, n, l) {
+ const c = n.havingBaseStyle(e), m = O.makeSpan(l.concat(c.sizingClasses(n)), [t], n), b = c.sizeMultiplier / n.sizeMultiplier;
+ return m.height *= b, m.depth *= b, m.maxFontSize = c.sizeMultiplier, m;
+ }, wi = function(t, e, n) {
+ const l = e.havingBaseStyle(n), c = (1 - e.sizeMultiplier / l.sizeMultiplier) * e.fontMetrics().axisHeight;
+ t.classes.push("delimcenter"), t.style.top = $(c), t.height -= c, t.depth += c;
+ }, Au = function(t, e, n, l, c, m) {
+ const b = O.makeSymbol(t, "Main-Regular", c, l), _ = Ur(b, e, l, m);
+ return n && wi(_, l, e), _;
+ }, Su = function(t, e, n, l) {
+ return O.makeSymbol(t, "Size" + e + "-Regular", n, l);
+ }, yi = function(t, e, n, l, c, m) {
+ const b = Su(t, e, c, l), _ = Ur(O.makeSpan(["delimsizing", "size" + e], [b], l), ae.TEXT, l, m);
+ return n && wi(_, l, ae.TEXT), _;
+ }, Gr = function(t, e, n) {
+ let l;
+ return e === "Size1-Regular" ? l = "delim-size1" : l = "delim-size4", {
+ type: "elem",
+ elem: O.makeSpan(["delimsizinginner", l], [O.makeSpan([], [O.makeSymbol(t, e, n)])])
+ };
+ }, Vr = function(t, e, n) {
+ const l = gt["Size4-Regular"][t.charCodeAt(0)] ? gt["Size4-Regular"][t.charCodeAt(0)][4] : gt["Size1-Regular"][t.charCodeAt(0)][4], c = new Pt("inner", b0(t, Math.round(1e3 * e))), m = new St([c], {
+ width: $(l),
+ height: $(e),
+ // Override CSS rule `.katex svg { width: 100% }`
+ style: "width:" + $(l),
+ viewBox: "0 0 " + 1e3 * l + " " + Math.round(1e3 * e),
+ preserveAspectRatio: "xMinYMin"
+ }), b = O.makeSvgSpan([], [m], n);
+ return b.height = e, b.style.height = $(e), b.style.width = $(l), {
+ type: "elem",
+ elem: b
+ };
+ }, Wr = 8e-3, Qn = {
+ type: "kern",
+ size: -1 * Wr
+ }, Fu = ["|", "\\lvert", "\\rvert", "\\vert"], Eu = ["\\|", "\\lVert", "\\rVert", "\\Vert"], _i = function(t, e, n, l, c, m) {
+ let b, _, x, F, B = "", I = 0;
+ b = x = F = t, _ = null;
+ let q = "Size1-Regular";
+ t === "\\uparrow" ? x = F = "⏐" : t === "\\Uparrow" ? x = F = "‖" : t === "\\downarrow" ? b = x = "⏐" : t === "\\Downarrow" ? b = x = "‖" : t === "\\updownarrow" ? (b = "\\uparrow", x = "⏐", F = "\\downarrow") : t === "\\Updownarrow" ? (b = "\\Uparrow", x = "‖", F = "\\Downarrow") : R.contains(Fu, t) ? (x = "∣", B = "vert", I = 333) : R.contains(Eu, t) ? (x = "∥", B = "doublevert", I = 556) : t === "[" || t === "\\lbrack" ? (b = "⎡", x = "⎢", F = "⎣", q = "Size4-Regular", B = "lbrack", I = 667) : t === "]" || t === "\\rbrack" ? (b = "⎤", x = "⎥", F = "⎦", q = "Size4-Regular", B = "rbrack", I = 667) : t === "\\lfloor" || t === "⌊" ? (x = b = "⎢", F = "⎣", q = "Size4-Regular", B = "lfloor", I = 667) : t === "\\lceil" || t === "⌈" ? (b = "⎡", x = F = "⎢", q = "Size4-Regular", B = "lceil", I = 667) : t === "\\rfloor" || t === "⌋" ? (x = b = "⎥", F = "⎦", q = "Size4-Regular", B = "rfloor", I = 667) : t === "\\rceil" || t === "⌉" ? (b = "⎤", x = F = "⎥", q = "Size4-Regular", B = "rceil", I = 667) : t === "(" || t === "\\lparen" ? (b = "⎛", x = "⎜", F = "⎝", q = "Size4-Regular", B = "lparen", I = 875) : t === ")" || t === "\\rparen" ? (b = "⎞", x = "⎟", F = "⎠", q = "Size4-Regular", B = "rparen", I = 875) : t === "\\{" || t === "\\lbrace" ? (b = "⎧", _ = "⎨", F = "⎩", x = "⎪", q = "Size4-Regular") : t === "\\}" || t === "\\rbrace" ? (b = "⎫", _ = "⎬", F = "⎭", x = "⎪", q = "Size4-Regular") : t === "\\lgroup" || t === "⟮" ? (b = "⎧", F = "⎩", x = "⎪", q = "Size4-Regular") : t === "\\rgroup" || t === "⟯" ? (b = "⎫", F = "⎭", x = "⎪", q = "Size4-Regular") : t === "\\lmoustache" || t === "⎰" ? (b = "⎧", F = "⎭", x = "⎪", q = "Size4-Regular") : (t === "\\rmoustache" || t === "⎱") && (b = "⎫", F = "⎩", x = "⎪", q = "Size4-Regular");
+ const W = kn(b, q, c), se = W.height + W.depth, ue = kn(x, q, c), xe = ue.height + ue.depth, we = kn(F, q, c), De = we.height + we.depth;
+ let Fe = 0, qe = 1;
+ if (_ !== null) {
+ const Ye = kn(_, q, c);
+ Fe = Ye.height + Ye.depth, qe = 2;
+ }
+ const lt = se + De + Fe, $e = Math.max(0, Math.ceil((e - lt) / (qe * xe))), Tt = lt + $e * qe * xe;
+ let rn = l.fontMetrics().axisHeight;
+ n && (rn *= l.sizeMultiplier);
+ const Ae = Tt / 2 - rn, Te = [];
+ if (B.length > 0) {
+ const Ye = Tt - se - De, je = Math.round(Tt * 1e3), Mt = K0(B, Math.round(Ye * 1e3)), e1 = new Pt(B, Mt), cl = (I / 1e3).toFixed(3) + "em", hl = (je / 1e3).toFixed(3) + "em", t1 = new St([e1], {
+ width: cl,
+ height: hl,
+ viewBox: "0 0 " + I + " " + je
+ }), nr = O.makeSvgSpan([], [t1], l);
+ nr.height = je / 1e3, nr.style.width = cl, nr.style.height = hl, Te.push({
+ type: "elem",
+ elem: nr
+ });
+ } else {
+ if (Te.push(Gr(F, q, c)), Te.push(Qn), _ === null) {
+ const Ye = Tt - se - De + 2 * Wr;
+ Te.push(Vr(x, Ye, l));
+ } else {
+ const Ye = (Tt - se - De - Fe) / 2 + 2 * Wr;
+ Te.push(Vr(x, Ye, l)), Te.push(Qn), Te.push(Gr(_, q, c)), Te.push(Qn), Te.push(Vr(x, Ye, l));
+ }
+ Te.push(Qn), Te.push(Gr(b, q, c));
+ }
+ const He = l.havingBaseStyle(ae.TEXT), Ve = O.makeVList({
+ positionType: "bottom",
+ positionData: Ae,
+ children: Te
+ }, He);
+ return Ur(O.makeSpan(["delimsizing", "mult"], [Ve], He), ae.TEXT, l, m);
+ }, jr = 80, Xr = 0.08, Yr = function(t, e, n, l, c) {
+ const m = pn(t, l, n), b = new Pt(t, m), _ = new St([b], {
+ // Note: 1000:1 ratio of viewBox to document em width.
+ width: "400em",
+ height: $(e),
+ viewBox: "0 0 400000 " + n,
+ preserveAspectRatio: "xMinYMin slice"
+ });
+ return O.makeSvgSpan(["hide-tail"], [_], c);
+ }, Cu = function(t, e) {
+ const n = e.havingBaseSizing(), l = vi("\\surd", t * n.sizeMultiplier, Di, n);
+ let c = n.sizeMultiplier;
+ const m = Math.max(0, e.minRuleThickness - e.fontMetrics().sqrtRuleThickness);
+ let b, _ = 0, x = 0, F = 0, B;
+ return l.type === "small" ? (F = 1e3 + 1e3 * m + jr, t < 1 ? c = 1 : t < 1.4 && (c = 0.7), _ = (1 + m + Xr) / c, x = (1 + m) / c, b = Yr("sqrtMain", _, F, m, e), b.style.minWidth = "0.853em", B = 0.833 / c) : l.type === "large" ? (F = (1e3 + jr) * xn[l.size], x = (xn[l.size] + m) / c, _ = (xn[l.size] + m + Xr) / c, b = Yr("sqrtSize" + l.size, _, F, m, e), b.style.minWidth = "1.02em", B = 1 / c) : (_ = t + m + Xr, x = t + m, F = Math.floor(1e3 * t + m) + jr, b = Yr("sqrtTall", _, F, m, e), b.style.minWidth = "0.742em", B = 1.056), b.height = x, b.style.height = $(_), {
+ span: b,
+ advanceWidth: B,
+ // Calculate the actual line width.
+ // This actually should depend on the chosen font -- e.g. \boldmath
+ // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and
+ // have thicker rules.
+ ruleWidth: (e.fontMetrics().sqrtRuleThickness + m) * c
+ };
+ }, ki = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "⌊", "⌋", "\\lceil", "\\rceil", "⌈", "⌉", "\\surd"], Tu = ["\\uparrow", "\\downarrow", "\\updownarrow", "\\Uparrow", "\\Downarrow", "\\Updownarrow", "|", "\\|", "\\vert", "\\Vert", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "⟮", "⟯", "\\lmoustache", "\\rmoustache", "⎰", "⎱"], xi = ["<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"], xn = [0, 1.2, 1.8, 2.4, 3], Mu = function(t, e, n, l, c) {
+ if (t === "<" || t === "\\lt" || t === "⟨" ? t = "\\langle" : (t === ">" || t === "\\gt" || t === "⟩") && (t = "\\rangle"), R.contains(ki, t) || R.contains(xi, t))
+ return yi(t, e, !1, n, l, c);
+ if (R.contains(Tu, t))
+ return _i(t, xn[e], !1, n, l, c);
+ throw new u("Illegal delimiter: '" + t + "'");
+ }, zu = [{
+ type: "small",
+ style: ae.SCRIPTSCRIPT
+ }, {
+ type: "small",
+ style: ae.SCRIPT
+ }, {
+ type: "small",
+ style: ae.TEXT
+ }, {
+ type: "large",
+ size: 1
+ }, {
+ type: "large",
+ size: 2
+ }, {
+ type: "large",
+ size: 3
+ }, {
+ type: "large",
+ size: 4
+ }], Bu = [{
+ type: "small",
+ style: ae.SCRIPTSCRIPT
+ }, {
+ type: "small",
+ style: ae.SCRIPT
+ }, {
+ type: "small",
+ style: ae.TEXT
+ }, {
+ type: "stack"
+ }], Di = [{
+ type: "small",
+ style: ae.SCRIPTSCRIPT
+ }, {
+ type: "small",
+ style: ae.SCRIPT
+ }, {
+ type: "small",
+ style: ae.TEXT
+ }, {
+ type: "large",
+ size: 1
+ }, {
+ type: "large",
+ size: 2
+ }, {
+ type: "large",
+ size: 3
+ }, {
+ type: "large",
+ size: 4
+ }, {
+ type: "stack"
+ }], Nu = function(t) {
+ if (t.type === "small")
+ return "Main-Regular";
+ if (t.type === "large")
+ return "Size" + t.size + "-Regular";
+ if (t.type === "stack")
+ return "Size4-Regular";
+ throw new Error("Add support for delim type '" + t.type + "' here.");
+ }, vi = function(t, e, n, l) {
+ const c = Math.min(2, 3 - l.style.size);
+ for (let m = c; m < n.length && n[m].type !== "stack"; m++) {
+ const b = kn(t, Nu(n[m]), "math");
+ let _ = b.height + b.depth;
+ if (n[m].type === "small") {
+ const x = l.havingBaseStyle(n[m].style);
+ _ *= x.sizeMultiplier;
+ }
+ if (_ > e)
+ return n[m];
+ }
+ return n[n.length - 1];
+ }, Ai = function(t, e, n, l, c, m) {
+ t === "<" || t === "\\lt" || t === "⟨" ? t = "\\langle" : (t === ">" || t === "\\gt" || t === "⟩") && (t = "\\rangle");
+ let b;
+ R.contains(xi, t) ? b = zu : R.contains(ki, t) ? b = Di : b = Bu;
+ const _ = vi(t, e, b, l);
+ return _.type === "small" ? Au(t, _.style, n, l, c, m) : _.type === "large" ? yi(t, _.size, n, l, c, m) : _i(t, e, n, l, c, m);
+ };
+ var d0 = {
+ sqrtImage: Cu,
+ sizedDelim: Mu,
+ sizeToMaxHeight: xn,
+ customSizedDelim: Ai,
+ leftRightDelim: function(t, e, n, l, c, m) {
+ const b = l.fontMetrics().axisHeight * l.sizeMultiplier, _ = 901, x = 5 / l.fontMetrics().ptPerEm, F = Math.max(e - b, n + b), B = Math.max(
+ // In real TeX, calculations are done using integral values which are
+ // 65536 per pt, or 655360 per em. So, the division here truncates in
+ // TeX but doesn't here, producing different results. If we wanted to
+ // exactly match TeX's calculation, we could do
+ // Math.floor(655360 * maxDistFromAxis / 500) *
+ // delimiterFactor / 655360
+ // (To see the difference, compare
+ // x^{x^{\left(\rule{0.1em}{0.68em}\right)}}
+ // in TeX and KaTeX)
+ F / 500 * _,
+ 2 * F - x
+ );
+ return Ai(t, B, !0, l, c, m);
+ }
+ };
+ const Si = {
+ "\\bigl": {
+ mclass: "mopen",
+ size: 1
+ },
+ "\\Bigl": {
+ mclass: "mopen",
+ size: 2
+ },
+ "\\biggl": {
+ mclass: "mopen",
+ size: 3
+ },
+ "\\Biggl": {
+ mclass: "mopen",
+ size: 4
+ },
+ "\\bigr": {
+ mclass: "mclose",
+ size: 1
+ },
+ "\\Bigr": {
+ mclass: "mclose",
+ size: 2
+ },
+ "\\biggr": {
+ mclass: "mclose",
+ size: 3
+ },
+ "\\Biggr": {
+ mclass: "mclose",
+ size: 4
+ },
+ "\\bigm": {
+ mclass: "mrel",
+ size: 1
+ },
+ "\\Bigm": {
+ mclass: "mrel",
+ size: 2
+ },
+ "\\biggm": {
+ mclass: "mrel",
+ size: 3
+ },
+ "\\Biggm": {
+ mclass: "mrel",
+ size: 4
+ },
+ "\\big": {
+ mclass: "mord",
+ size: 1
+ },
+ "\\Big": {
+ mclass: "mord",
+ size: 2
+ },
+ "\\bigg": {
+ mclass: "mord",
+ size: 3
+ },
+ "\\Bigg": {
+ mclass: "mord",
+ size: 4
+ }
+ }, Ru = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "⌊", "⌋", "\\lceil", "\\rceil", "⌈", "⌉", "<", ">", "\\langle", "⟨", "\\rangle", "⟩", "\\lt", "\\gt", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "⟮", "⟯", "\\lmoustache", "\\rmoustache", "⎰", "⎱", "/", "\\backslash", "|", "\\vert", "\\|", "\\Vert", "\\uparrow", "\\Uparrow", "\\downarrow", "\\Downarrow", "\\updownarrow", "\\Updownarrow", "."];
+ function Jn(t, e) {
+ const n = Yn(t);
+ if (n && R.contains(Ru, n.text))
+ return n;
+ throw n ? new u("Invalid delimiter '" + n.text + "' after '" + e.funcName + "'", t) : new u("Invalid delimiter type '" + t.type + "'", t);
+ }
+ ne({
+ type: "delimsizing",
+ names: ["\\bigl", "\\Bigl", "\\biggl", "\\Biggl", "\\bigr", "\\Bigr", "\\biggr", "\\Biggr", "\\bigm", "\\Bigm", "\\biggm", "\\Biggm", "\\big", "\\Big", "\\bigg", "\\Bigg"],
+ props: {
+ numArgs: 1,
+ argTypes: ["primitive"]
+ },
+ handler: (t, e) => {
+ const n = Jn(e[0], t);
+ return {
+ type: "delimsizing",
+ mode: t.parser.mode,
+ size: Si[t.funcName].size,
+ mclass: Si[t.funcName].mclass,
+ delim: n.text
+ };
+ },
+ htmlBuilder: (t, e) => t.delim === "." ? O.makeSpan([t.mclass]) : d0.sizedDelim(t.delim, t.size, e, t.mode, [t.mclass]),
+ mathmlBuilder: (t) => {
+ const e = [];
+ t.delim !== "." && e.push(Et(t.delim, t.mode));
+ const n = new Y.MathNode("mo", e);
+ t.mclass === "mopen" || t.mclass === "mclose" ? n.setAttribute("fence", "true") : n.setAttribute("fence", "false"), n.setAttribute("stretchy", "true");
+ const l = $(d0.sizeToMaxHeight[t.size]);
+ return n.setAttribute("minsize", l), n.setAttribute("maxsize", l), n;
+ }
+ });
+ function Fi(t) {
+ if (!t.body)
+ throw new Error("Bug: The leftright ParseNode wasn't fully parsed.");
+ }
+ ne({
+ type: "leftright-right",
+ names: ["\\right"],
+ props: {
+ numArgs: 1,
+ primitive: !0
+ },
+ handler: (t, e) => {
+ const n = t.parser.gullet.macros.get("\\current@color");
+ if (n && typeof n != "string")
+ throw new u("\\current@color set to non-string in \\right");
+ return {
+ type: "leftright-right",
+ mode: t.parser.mode,
+ delim: Jn(e[0], t).text,
+ color: n
+ // undefined if not set via \color
+ };
+ }
+ }), ne({
+ type: "leftright",
+ names: ["\\left"],
+ props: {
+ numArgs: 1,
+ primitive: !0
+ },
+ handler: (t, e) => {
+ const n = Jn(e[0], t), l = t.parser;
+ ++l.leftrightDepth;
+ const c = l.parseExpression(!1);
+ --l.leftrightDepth, l.expect("\\right", !1);
+ const m = pe(l.parseFunction(), "leftright-right");
+ return {
+ type: "leftright",
+ mode: l.mode,
+ body: c,
+ left: n.text,
+ right: m.delim,
+ rightColor: m.color
+ };
+ },
+ htmlBuilder: (t, e) => {
+ Fi(t);
+ const n = Je(t.body, e, !0, ["mopen", "mclose"]);
+ let l = 0, c = 0, m = !1;
+ for (let x = 0; x < n.length; x++)
+ n[x].isMiddle ? m = !0 : (l = Math.max(n[x].height, l), c = Math.max(n[x].depth, c));
+ l *= e.sizeMultiplier, c *= e.sizeMultiplier;
+ let b;
+ if (t.left === "." ? b = yn(e, ["mopen"]) : b = d0.leftRightDelim(t.left, l, c, e, t.mode, ["mopen"]), n.unshift(b), m)
+ for (let x = 1; x < n.length; x++) {
+ const B = n[x].isMiddle;
+ B && (n[x] = d0.leftRightDelim(B.delim, l, c, B.options, t.mode, []));
+ }
+ let _;
+ if (t.right === ".")
+ _ = yn(e, ["mclose"]);
+ else {
+ const x = t.rightColor ? e.withColor(t.rightColor) : e;
+ _ = d0.leftRightDelim(t.right, l, c, x, t.mode, ["mclose"]);
+ }
+ return n.push(_), O.makeSpan(["minner"], n, e);
+ },
+ mathmlBuilder: (t, e) => {
+ Fi(t);
+ const n = dt(t.body, e);
+ if (t.left !== ".") {
+ const l = new Y.MathNode("mo", [Et(t.left, t.mode)]);
+ l.setAttribute("fence", "true"), n.unshift(l);
+ }
+ if (t.right !== ".") {
+ const l = new Y.MathNode("mo", [Et(t.right, t.mode)]);
+ l.setAttribute("fence", "true"), t.rightColor && l.setAttribute("mathcolor", t.rightColor), n.push(l);
+ }
+ return Lr(n);
+ }
+ }), ne({
+ type: "middle",
+ names: ["\\middle"],
+ props: {
+ numArgs: 1,
+ primitive: !0
+ },
+ handler: (t, e) => {
+ const n = Jn(e[0], t);
+ if (!t.parser.leftrightDepth)
+ throw new u("\\middle without preceding \\left", n);
+ return {
+ type: "middle",
+ mode: t.parser.mode,
+ delim: n.text
+ };
+ },
+ htmlBuilder: (t, e) => {
+ let n;
+ if (t.delim === ".")
+ n = yn(e, []);
+ else {
+ n = d0.sizedDelim(t.delim, 1, e, t.mode, []);
+ const l = {
+ delim: t.delim,
+ options: e
+ };
+ n.isMiddle = l;
+ }
+ return n;
+ },
+ mathmlBuilder: (t, e) => {
+ const n = t.delim === "\\vert" || t.delim === "|" ? Et("|", "text") : Et(t.delim, t.mode), l = new Y.MathNode("mo", [n]);
+ return l.setAttribute("fence", "true"), l.setAttribute("lspace", "0.05em"), l.setAttribute("rspace", "0.05em"), l;
+ }
+ });
+ const Zr = (t, e) => {
+ const n = O.wrapFragment(ve(t.body, e), e), l = t.label.slice(1);
+ let c = e.sizeMultiplier, m, b = 0;
+ const _ = R.isCharacterBox(t.body);
+ if (l === "sout")
+ m = O.makeSpan(["stretchy", "sout"]), m.height = e.fontMetrics().defaultRuleThickness / c, b = -0.5 * e.fontMetrics().xHeight;
+ else if (l === "phase") {
+ const F = Ne({
+ number: 0.6,
+ unit: "pt"
+ }, e), B = Ne({
+ number: 0.35,
+ unit: "ex"
+ }, e), I = e.havingBaseSizing();
+ c = c / I.sizeMultiplier;
+ const q = n.height + n.depth + F + B;
+ n.style.paddingLeft = $(q / 2 + F);
+ const W = Math.floor(1e3 * q * c), se = Ot(W), ue = new St([new Pt("phase", se)], {
+ width: "400em",
+ height: $(W / 1e3),
+ viewBox: "0 0 400000 " + W,
+ preserveAspectRatio: "xMinYMin slice"
+ });
+ m = O.makeSvgSpan(["hide-tail"], [ue], e), m.style.height = $(q), b = n.depth + F + B;
+ } else {
+ /cancel/.test(l) ? _ || n.classes.push("cancel-pad") : l === "angl" ? n.classes.push("anglpad") : n.classes.push("boxpad");
+ let F = 0, B = 0, I = 0;
+ /box/.test(l) ? (I = Math.max(
+ e.fontMetrics().fboxrule,
+ // default
+ e.minRuleThickness
+ // User override.
+ ), F = e.fontMetrics().fboxsep + (l === "colorbox" ? 0 : I), B = F) : l === "angl" ? (I = Math.max(e.fontMetrics().defaultRuleThickness, e.minRuleThickness), F = 4 * I, B = Math.max(0, 0.25 - n.depth)) : (F = _ ? 0.2 : 0, B = F), m = f0.encloseSpan(n, l, F, B, e), /fbox|boxed|fcolorbox/.test(l) ? (m.style.borderStyle = "solid", m.style.borderWidth = $(I)) : l === "angl" && I !== 0.049 && (m.style.borderTopWidth = $(I), m.style.borderRightWidth = $(I)), b = n.depth + B, t.backgroundColor && (m.style.backgroundColor = t.backgroundColor, t.borderColor && (m.style.borderColor = t.borderColor));
+ }
+ let x;
+ if (t.backgroundColor)
+ x = O.makeVList({
+ positionType: "individualShift",
+ children: [
+ // Put the color background behind inner;
+ {
+ type: "elem",
+ elem: m,
+ shift: b
+ },
+ {
+ type: "elem",
+ elem: n,
+ shift: 0
+ }
+ ]
+ }, e);
+ else {
+ const F = /cancel|phase/.test(l) ? ["svg-align"] : [];
+ x = O.makeVList({
+ positionType: "individualShift",
+ children: [
+ // Write the \cancel stroke on top of inner.
+ {
+ type: "elem",
+ elem: n,
+ shift: 0
+ },
+ {
+ type: "elem",
+ elem: m,
+ shift: b,
+ wrapperClasses: F
+ }
+ ]
+ }, e);
+ }
+ return /cancel/.test(l) && (x.height = n.height, x.depth = n.depth), /cancel/.test(l) && !_ ? O.makeSpan(["mord", "cancel-lap"], [x], e) : O.makeSpan(["mord"], [x], e);
+ }, Kr = (t, e) => {
+ let n = 0;
+ const l = new Y.MathNode(t.label.indexOf("colorbox") > -1 ? "mpadded" : "menclose", [Ie(t.body, e)]);
+ switch (t.label) {
+ case "\\cancel":
+ l.setAttribute("notation", "updiagonalstrike");
+ break;
+ case "\\bcancel":
+ l.setAttribute("notation", "downdiagonalstrike");
+ break;
+ case "\\phase":
+ l.setAttribute("notation", "phasorangle");
+ break;
+ case "\\sout":
+ l.setAttribute("notation", "horizontalstrike");
+ break;
+ case "\\fbox":
+ l.setAttribute("notation", "box");
+ break;
+ case "\\angl":
+ l.setAttribute("notation", "actuarial");
+ break;
+ case "\\fcolorbox":
+ case "\\colorbox":
+ if (n = e.fontMetrics().fboxsep * e.fontMetrics().ptPerEm, l.setAttribute("width", "+" + 2 * n + "pt"), l.setAttribute("height", "+" + 2 * n + "pt"), l.setAttribute("lspace", n + "pt"), l.setAttribute("voffset", n + "pt"), t.label === "\\fcolorbox") {
+ const c = Math.max(
+ e.fontMetrics().fboxrule,
+ // default
+ e.minRuleThickness
+ // user override
+ );
+ l.setAttribute("style", "border: " + c + "em solid " + String(t.borderColor));
+ }
+ break;
+ case "\\xcancel":
+ l.setAttribute("notation", "updiagonalstrike downdiagonalstrike");
+ break;
+ }
+ return t.backgroundColor && l.setAttribute("mathbackground", t.backgroundColor), l;
+ };
+ ne({
+ type: "enclose",
+ names: ["\\colorbox"],
+ props: {
+ numArgs: 2,
+ allowedInText: !0,
+ argTypes: ["color", "text"]
+ },
+ handler(t, e, n) {
+ let {
+ parser: l,
+ funcName: c
+ } = t;
+ const m = pe(e[0], "color-token").color, b = e[1];
+ return {
+ type: "enclose",
+ mode: l.mode,
+ label: c,
+ backgroundColor: m,
+ body: b
+ };
+ },
+ htmlBuilder: Zr,
+ mathmlBuilder: Kr
+ }), ne({
+ type: "enclose",
+ names: ["\\fcolorbox"],
+ props: {
+ numArgs: 3,
+ allowedInText: !0,
+ argTypes: ["color", "color", "text"]
+ },
+ handler(t, e, n) {
+ let {
+ parser: l,
+ funcName: c
+ } = t;
+ const m = pe(e[0], "color-token").color, b = pe(e[1], "color-token").color, _ = e[2];
+ return {
+ type: "enclose",
+ mode: l.mode,
+ label: c,
+ backgroundColor: b,
+ borderColor: m,
+ body: _
+ };
+ },
+ htmlBuilder: Zr,
+ mathmlBuilder: Kr
+ }), ne({
+ type: "enclose",
+ names: ["\\fbox"],
+ props: {
+ numArgs: 1,
+ argTypes: ["hbox"],
+ allowedInText: !0
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ return {
+ type: "enclose",
+ mode: n.mode,
+ label: "\\fbox",
+ body: e[0]
+ };
+ }
+ }), ne({
+ type: "enclose",
+ names: ["\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\phase"],
+ props: {
+ numArgs: 1
+ },
+ handler(t, e) {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = e[0];
+ return {
+ type: "enclose",
+ mode: n.mode,
+ label: l,
+ body: c
+ };
+ },
+ htmlBuilder: Zr,
+ mathmlBuilder: Kr
+ }), ne({
+ type: "enclose",
+ names: ["\\angl"],
+ props: {
+ numArgs: 1,
+ argTypes: ["hbox"],
+ allowedInText: !1
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ return {
+ type: "enclose",
+ mode: n.mode,
+ label: "\\angl",
+ body: e[0]
+ };
+ }
+ });
+ const Ei = {};
+ function Qt(t) {
+ let {
+ type: e,
+ names: n,
+ props: l,
+ handler: c,
+ htmlBuilder: m,
+ mathmlBuilder: b
+ } = t;
+ const _ = {
+ type: e,
+ numArgs: l.numArgs || 0,
+ allowedInText: !1,
+ numOptionalArgs: 0,
+ handler: c
+ };
+ for (let x = 0; x < n.length; ++x)
+ Ei[n[x]] = _;
+ m && (Vn[e] = m), b && (Wn[e] = b);
+ }
+ const Ci = {};
+ function k(t, e) {
+ Ci[t] = e;
+ }
+ class bt {
+ // The + prefix indicates that these fields aren't writeable
+ // Lexer holding the input string.
+ // Start offset, zero-based inclusive.
+ // End offset, zero-based exclusive.
+ constructor(e, n, l) {
+ this.lexer = void 0, this.start = void 0, this.end = void 0, this.lexer = e, this.start = n, this.end = l;
+ }
+ /**
+ * Merges two `SourceLocation`s from location providers, given they are
+ * provided in order of appearance.
+ * - Returns the first one's location if only the first is provided.
+ * - Returns a merged range of the first and the last if both are provided
+ * and their lexers match.
+ * - Otherwise, returns null.
+ */
+ static range(e, n) {
+ return n ? !e || !e.loc || !n.loc || e.loc.lexer !== n.loc.lexer ? null : new bt(e.loc.lexer, e.loc.start, n.loc.end) : e && e.loc;
+ }
+ }
+ class Ct {
+ // don't expand the token
+ // used in \noexpand
+ constructor(e, n) {
+ this.text = void 0, this.loc = void 0, this.noexpand = void 0, this.treatAsRelax = void 0, this.text = e, this.loc = n;
+ }
+ /**
+ * Given a pair of tokens (this and endToken), compute a `Token` encompassing
+ * the whole input range enclosed by these two.
+ */
+ range(e, n) {
+ return new Ct(n, bt.range(this, e));
+ }
+ }
+ function Ti(t) {
+ const e = [];
+ t.consumeSpaces();
+ let n = t.fetch().text;
+ for (n === "\\relax" && (t.consume(), t.consumeSpaces(), n = t.fetch().text); n === "\\hline" || n === "\\hdashline"; )
+ t.consume(), e.push(n === "\\hdashline"), t.consumeSpaces(), n = t.fetch().text;
+ return e;
+ }
+ const $n = (t) => {
+ if (!t.parser.settings.displayMode)
+ throw new u("{" + t.envName + "} can be used only in display mode.");
+ };
+ function Qr(t) {
+ if (t.indexOf("ed") === -1)
+ return t.indexOf("*") === -1;
+ }
+ function A0(t, e, n) {
+ let {
+ hskipBeforeAndAfter: l,
+ addJot: c,
+ cols: m,
+ arraystretch: b,
+ colSeparationType: _,
+ autoTag: x,
+ singleRow: F,
+ emptySingleRow: B,
+ maxNumCols: I,
+ leqno: q
+ } = e;
+ if (t.gullet.beginGroup(), F || t.gullet.macros.set("\\cr", "\\\\\\relax"), !b) {
+ const qe = t.gullet.expandMacroAsText("\\arraystretch");
+ if (qe == null)
+ b = 1;
+ else if (b = parseFloat(qe), !b || b < 0)
+ throw new u("Invalid \\arraystretch: " + qe);
+ }
+ t.gullet.beginGroup();
+ let W = [];
+ const se = [W], ue = [], xe = [], we = x != null ? [] : void 0;
+ function De() {
+ x && t.gullet.macros.set("\\@eqnsw", "1", !0);
+ }
+ function Fe() {
+ we && (t.gullet.macros.get("\\df@tag") ? (we.push(t.subparse([new Ct("\\df@tag")])), t.gullet.macros.set("\\df@tag", void 0, !0)) : we.push(!!x && t.gullet.macros.get("\\@eqnsw") === "1"));
+ }
+ for (De(), xe.push(Ti(t)); ; ) {
+ let qe = t.parseExpression(!1, F ? "\\end" : "\\\\");
+ t.gullet.endGroup(), t.gullet.beginGroup(), qe = {
+ type: "ordgroup",
+ mode: t.mode,
+ body: qe
+ }, n && (qe = {
+ type: "styling",
+ mode: t.mode,
+ style: n,
+ body: [qe]
+ }), W.push(qe);
+ const lt = t.fetch().text;
+ if (lt === "&") {
+ if (I && W.length === I) {
+ if (F || _)
+ throw new u("Too many tab characters: &", t.nextToken);
+ t.settings.reportNonstrict("textEnv", "Too few columns specified in the {array} column argument.");
+ }
+ t.consume();
+ } else if (lt === "\\end") {
+ Fe(), W.length === 1 && qe.type === "styling" && qe.body[0].body.length === 0 && (se.length > 1 || !B) && se.pop(), xe.length < se.length + 1 && xe.push([]);
+ break;
+ } else if (lt === "\\\\") {
+ t.consume();
+ let $e;
+ t.gullet.future().text !== " " && ($e = t.parseSizeGroup(!0)), ue.push($e ? $e.value : null), Fe(), xe.push(Ti(t)), W = [], se.push(W), De();
+ } else
+ throw new u("Expected & or \\\\ or \\cr or \\end", t.nextToken);
+ }
+ return t.gullet.endGroup(), t.gullet.endGroup(), {
+ type: "array",
+ mode: t.mode,
+ addJot: c,
+ arraystretch: b,
+ body: se,
+ cols: m,
+ rowGaps: ue,
+ hskipBeforeAndAfter: l,
+ hLinesBeforeRow: xe,
+ colSeparationType: _,
+ tags: we,
+ leqno: q
+ };
+ }
+ function Jr(t) {
+ return t.slice(0, 1) === "d" ? "display" : "text";
+ }
+ const Jt = function(t, e) {
+ let n, l;
+ const c = t.body.length, m = t.hLinesBeforeRow;
+ let b = 0, _ = new Array(c);
+ const x = [], F = Math.max(
+ // From LaTeX \showthe\arrayrulewidth. Equals 0.04 em.
+ e.fontMetrics().arrayRuleWidth,
+ e.minRuleThickness
+ // User override.
+ ), B = 1 / e.fontMetrics().ptPerEm;
+ let I = 5 * B;
+ t.colSeparationType && t.colSeparationType === "small" && (I = 0.2778 * (e.havingStyle(ae.SCRIPT).sizeMultiplier / e.sizeMultiplier));
+ const q = t.colSeparationType === "CD" ? Ne({
+ number: 3,
+ unit: "ex"
+ }, e) : 12 * B, W = 3 * B, se = t.arraystretch * q, ue = 0.7 * se, xe = 0.3 * se;
+ let we = 0;
+ function De(Ae) {
+ for (let Te = 0; Te < Ae.length; ++Te)
+ Te > 0 && (we += 0.25), x.push({
+ pos: we,
+ isDashed: Ae[Te]
+ });
+ }
+ for (De(m[0]), n = 0; n < t.body.length; ++n) {
+ const Ae = t.body[n];
+ let Te = ue, He = xe;
+ b < Ae.length && (b = Ae.length);
+ const Ve = new Array(Ae.length);
+ for (l = 0; l < Ae.length; ++l) {
+ const Mt = ve(Ae[l], e);
+ He < Mt.depth && (He = Mt.depth), Te < Mt.height && (Te = Mt.height), Ve[l] = Mt;
+ }
+ const Ye = t.rowGaps[n];
+ let je = 0;
+ Ye && (je = Ne(Ye, e), je > 0 && (je += xe, He < je && (He = je), je = 0)), t.addJot && (He += W), Ve.height = Te, Ve.depth = He, we += Te, Ve.pos = we, we += He + je, _[n] = Ve, De(m[n + 1]);
+ }
+ const Fe = we / 2 + e.fontMetrics().axisHeight, qe = t.cols || [], lt = [];
+ let $e, Tt;
+ const rn = [];
+ if (t.tags && t.tags.some((Ae) => Ae))
+ for (n = 0; n < c; ++n) {
+ const Ae = _[n], Te = Ae.pos - Fe, He = t.tags[n];
+ let Ve;
+ He === !0 ? Ve = O.makeSpan(["eqn-num"], [], e) : He === !1 ? Ve = O.makeSpan([], [], e) : Ve = O.makeSpan([], Je(He, e, !0), e), Ve.depth = Ae.depth, Ve.height = Ae.height, rn.push({
+ type: "elem",
+ elem: Ve,
+ shift: Te
+ });
+ }
+ for (
+ l = 0, Tt = 0;
+ // Continue while either there are more columns or more column
+ // descriptions, so trailing separators don't get lost.
+ l < b || Tt < qe.length;
+ ++l, ++Tt
+ ) {
+ let Ae = qe[Tt] || {}, Te = !0;
+ for (; Ae.type === "separator"; ) {
+ if (Te || ($e = O.makeSpan(["arraycolsep"], []), $e.style.width = $(e.fontMetrics().doubleRuleSep), lt.push($e)), Ae.separator === "|" || Ae.separator === ":") {
+ const Ye = Ae.separator === "|" ? "solid" : "dashed", je = O.makeSpan(["vertical-separator"], [], e);
+ je.style.height = $(we), je.style.borderRightWidth = $(F), je.style.borderRightStyle = Ye, je.style.margin = "0 " + $(-F / 2);
+ const Mt = we - Fe;
+ Mt && (je.style.verticalAlign = $(-Mt)), lt.push(je);
+ } else
+ throw new u("Invalid separator type: " + Ae.separator);
+ Tt++, Ae = qe[Tt] || {}, Te = !1;
+ }
+ if (l >= b)
+ continue;
+ let He;
+ (l > 0 || t.hskipBeforeAndAfter) && (He = R.deflt(Ae.pregap, I), He !== 0 && ($e = O.makeSpan(["arraycolsep"], []), $e.style.width = $(He), lt.push($e)));
+ let Ve = [];
+ for (n = 0; n < c; ++n) {
+ const Ye = _[n], je = Ye[l];
+ if (!je)
+ continue;
+ const Mt = Ye.pos - Fe;
+ je.depth = Ye.depth, je.height = Ye.height, Ve.push({
+ type: "elem",
+ elem: je,
+ shift: Mt
+ });
+ }
+ Ve = O.makeVList({
+ positionType: "individualShift",
+ children: Ve
+ }, e), Ve = O.makeSpan(["col-align-" + (Ae.align || "c")], [Ve]), lt.push(Ve), (l < b - 1 || t.hskipBeforeAndAfter) && (He = R.deflt(Ae.postgap, I), He !== 0 && ($e = O.makeSpan(["arraycolsep"], []), $e.style.width = $(He), lt.push($e)));
+ }
+ if (_ = O.makeSpan(["mtable"], lt), x.length > 0) {
+ const Ae = O.makeLineSpan("hline", e, F), Te = O.makeLineSpan("hdashline", e, F), He = [{
+ type: "elem",
+ elem: _,
+ shift: 0
+ }];
+ for (; x.length > 0; ) {
+ const Ve = x.pop(), Ye = Ve.pos - Fe;
+ Ve.isDashed ? He.push({
+ type: "elem",
+ elem: Te,
+ shift: Ye
+ }) : He.push({
+ type: "elem",
+ elem: Ae,
+ shift: Ye
+ });
+ }
+ _ = O.makeVList({
+ positionType: "individualShift",
+ children: He
+ }, e);
+ }
+ if (rn.length === 0)
+ return O.makeSpan(["mord"], [_], e);
+ {
+ let Ae = O.makeVList({
+ positionType: "individualShift",
+ children: rn
+ }, e);
+ return Ae = O.makeSpan(["tag"], [Ae], e), O.makeFragment([_, Ae]);
+ }
+ }, Iu = {
+ c: "center ",
+ l: "left ",
+ r: "right "
+ }, $t = function(t, e) {
+ const n = [], l = new Y.MathNode("mtd", [], ["mtr-glue"]), c = new Y.MathNode("mtd", [], ["mml-eqn-num"]);
+ for (let I = 0; I < t.body.length; I++) {
+ const q = t.body[I], W = [];
+ for (let se = 0; se < q.length; se++)
+ W.push(new Y.MathNode("mtd", [Ie(q[se], e)]));
+ t.tags && t.tags[I] && (W.unshift(l), W.push(l), t.leqno ? W.unshift(c) : W.push(c)), n.push(new Y.MathNode("mtr", W));
+ }
+ let m = new Y.MathNode("mtable", n);
+ const b = t.arraystretch === 0.5 ? 0.1 : 0.16 + t.arraystretch - 1 + (t.addJot ? 0.09 : 0);
+ m.setAttribute("rowspacing", $(b));
+ let _ = "", x = "";
+ if (t.cols && t.cols.length > 0) {
+ const I = t.cols;
+ let q = "", W = !1, se = 0, ue = I.length;
+ I[0].type === "separator" && (_ += "top ", se = 1), I[I.length - 1].type === "separator" && (_ += "bottom ", ue -= 1);
+ for (let xe = se; xe < ue; xe++)
+ I[xe].type === "align" ? (x += Iu[I[xe].align], W && (q += "none "), W = !0) : I[xe].type === "separator" && W && (q += I[xe].separator === "|" ? "solid " : "dashed ", W = !1);
+ m.setAttribute("columnalign", x.trim()), /[sd]/.test(q) && m.setAttribute("columnlines", q.trim());
+ }
+ if (t.colSeparationType === "align") {
+ const I = t.cols || [];
+ let q = "";
+ for (let W = 1; W < I.length; W++)
+ q += W % 2 ? "0em " : "1em ";
+ m.setAttribute("columnspacing", q.trim());
+ } else
+ t.colSeparationType === "alignat" || t.colSeparationType === "gather" ? m.setAttribute("columnspacing", "0em") : t.colSeparationType === "small" ? m.setAttribute("columnspacing", "0.2778em") : t.colSeparationType === "CD" ? m.setAttribute("columnspacing", "0.5em") : m.setAttribute("columnspacing", "1em");
+ let F = "";
+ const B = t.hLinesBeforeRow;
+ _ += B[0].length > 0 ? "left " : "", _ += B[B.length - 1].length > 0 ? "right " : "";
+ for (let I = 1; I < B.length - 1; I++)
+ F += B[I].length === 0 ? "none " : B[I][0] ? "dashed " : "solid ";
+ return /[sd]/.test(F) && m.setAttribute("rowlines", F.trim()), _ !== "" && (m = new Y.MathNode("menclose", [m]), m.setAttribute("notation", _.trim())), t.arraystretch && t.arraystretch < 1 && (m = new Y.MathNode("mstyle", [m]), m.setAttribute("scriptlevel", "1")), m;
+ }, Mi = function(t, e) {
+ t.envName.indexOf("ed") === -1 && $n(t);
+ const n = [], l = t.envName.indexOf("at") > -1 ? "alignat" : "align", c = t.envName === "split", m = A0(t.parser, {
+ cols: n,
+ addJot: !0,
+ autoTag: c ? void 0 : Qr(t.envName),
+ emptySingleRow: !0,
+ colSeparationType: l,
+ maxNumCols: c ? 2 : void 0,
+ leqno: t.parser.settings.leqno
+ }, "display");
+ let b, _ = 0;
+ const x = {
+ type: "ordgroup",
+ mode: t.mode,
+ body: []
+ };
+ if (e[0] && e[0].type === "ordgroup") {
+ let B = "";
+ for (let I = 0; I < e[0].body.length; I++) {
+ const q = pe(e[0].body[I], "textord");
+ B += q.text;
+ }
+ b = Number(B), _ = b * 2;
+ }
+ const F = !_;
+ m.body.forEach(function(B) {
+ for (let I = 1; I < B.length; I += 2) {
+ const q = pe(B[I], "styling");
+ pe(q.body[0], "ordgroup").body.unshift(x);
+ }
+ if (F)
+ _ < B.length && (_ = B.length);
+ else {
+ const I = B.length / 2;
+ if (b < I)
+ throw new u("Too many math in a row: " + ("expected " + b + ", but got " + I), B[0]);
+ }
+ });
+ for (let B = 0; B < _; ++B) {
+ let I = "r", q = 0;
+ B % 2 === 1 ? I = "l" : B > 0 && F && (q = 1), n[B] = {
+ type: "align",
+ align: I,
+ pregap: q,
+ postgap: 0
+ };
+ }
+ return m.colSeparationType = F ? "align" : "alignat", m;
+ };
+ Qt({
+ type: "array",
+ names: ["array", "darray"],
+ props: {
+ numArgs: 1
+ },
+ handler(t, e) {
+ const c = (Yn(e[0]) ? [e[0]] : pe(e[0], "ordgroup").body).map(function(b) {
+ const x = qr(b).text;
+ if ("lcr".indexOf(x) !== -1)
+ return {
+ type: "align",
+ align: x
+ };
+ if (x === "|")
+ return {
+ type: "separator",
+ separator: "|"
+ };
+ if (x === ":")
+ return {
+ type: "separator",
+ separator: ":"
+ };
+ throw new u("Unknown column alignment: " + x, b);
+ }), m = {
+ cols: c,
+ hskipBeforeAndAfter: !0,
+ // \@preamble in lttab.dtx
+ maxNumCols: c.length
+ };
+ return A0(t.parser, m, Jr(t.envName));
+ },
+ htmlBuilder: Jt,
+ mathmlBuilder: $t
+ }), Qt({
+ type: "array",
+ names: ["matrix", "pmatrix", "bmatrix", "Bmatrix", "vmatrix", "Vmatrix", "matrix*", "pmatrix*", "bmatrix*", "Bmatrix*", "vmatrix*", "Vmatrix*"],
+ props: {
+ numArgs: 0
+ },
+ handler(t) {
+ const e = {
+ matrix: null,
+ pmatrix: ["(", ")"],
+ bmatrix: ["[", "]"],
+ Bmatrix: ["\\{", "\\}"],
+ vmatrix: ["|", "|"],
+ Vmatrix: ["\\Vert", "\\Vert"]
+ }[t.envName.replace("*", "")];
+ let n = "c";
+ const l = {
+ hskipBeforeAndAfter: !1,
+ cols: [{
+ type: "align",
+ align: n
+ }]
+ };
+ if (t.envName.charAt(t.envName.length - 1) === "*") {
+ const b = t.parser;
+ if (b.consumeSpaces(), b.fetch().text === "[") {
+ if (b.consume(), b.consumeSpaces(), n = b.fetch().text, "lcr".indexOf(n) === -1)
+ throw new u("Expected l or c or r", b.nextToken);
+ b.consume(), b.consumeSpaces(), b.expect("]"), b.consume(), l.cols = [{
+ type: "align",
+ align: n
+ }];
+ }
+ }
+ const c = A0(t.parser, l, Jr(t.envName)), m = Math.max(0, ...c.body.map((b) => b.length));
+ return c.cols = new Array(m).fill({
+ type: "align",
+ align: n
+ }), e ? {
+ type: "leftright",
+ mode: t.mode,
+ body: [c],
+ left: e[0],
+ right: e[1],
+ rightColor: void 0
+ // \right uninfluenced by \color in array
+ } : c;
+ },
+ htmlBuilder: Jt,
+ mathmlBuilder: $t
+ }), Qt({
+ type: "array",
+ names: ["smallmatrix"],
+ props: {
+ numArgs: 0
+ },
+ handler(t) {
+ const e = {
+ arraystretch: 0.5
+ }, n = A0(t.parser, e, "script");
+ return n.colSeparationType = "small", n;
+ },
+ htmlBuilder: Jt,
+ mathmlBuilder: $t
+ }), Qt({
+ type: "array",
+ names: ["subarray"],
+ props: {
+ numArgs: 1
+ },
+ handler(t, e) {
+ const c = (Yn(e[0]) ? [e[0]] : pe(e[0], "ordgroup").body).map(function(b) {
+ const x = qr(b).text;
+ if ("lc".indexOf(x) !== -1)
+ return {
+ type: "align",
+ align: x
+ };
+ throw new u("Unknown column alignment: " + x, b);
+ });
+ if (c.length > 1)
+ throw new u("{subarray} can contain only one column");
+ let m = {
+ cols: c,
+ hskipBeforeAndAfter: !1,
+ arraystretch: 0.5
+ };
+ if (m = A0(t.parser, m, "script"), m.body.length > 0 && m.body[0].length > 1)
+ throw new u("{subarray} can contain only one column");
+ return m;
+ },
+ htmlBuilder: Jt,
+ mathmlBuilder: $t
+ }), Qt({
+ type: "array",
+ names: ["cases", "dcases", "rcases", "drcases"],
+ props: {
+ numArgs: 0
+ },
+ handler(t) {
+ const e = {
+ arraystretch: 1.2,
+ cols: [{
+ type: "align",
+ align: "l",
+ pregap: 0,
+ // TODO(kevinb) get the current style.
+ // For now we use the metrics for TEXT style which is what we were
+ // doing before. Before attempting to get the current style we
+ // should look at TeX's behavior especially for \over and matrices.
+ postgap: 1
+ /* 1em quad */
+ }, {
+ type: "align",
+ align: "l",
+ pregap: 0,
+ postgap: 0
+ }]
+ }, n = A0(t.parser, e, Jr(t.envName));
+ return {
+ type: "leftright",
+ mode: t.mode,
+ body: [n],
+ left: t.envName.indexOf("r") > -1 ? "." : "\\{",
+ right: t.envName.indexOf("r") > -1 ? "\\}" : ".",
+ rightColor: void 0
+ };
+ },
+ htmlBuilder: Jt,
+ mathmlBuilder: $t
+ }), Qt({
+ type: "array",
+ names: ["align", "align*", "aligned", "split"],
+ props: {
+ numArgs: 0
+ },
+ handler: Mi,
+ htmlBuilder: Jt,
+ mathmlBuilder: $t
+ }), Qt({
+ type: "array",
+ names: ["gathered", "gather", "gather*"],
+ props: {
+ numArgs: 0
+ },
+ handler(t) {
+ R.contains(["gather", "gather*"], t.envName) && $n(t);
+ const e = {
+ cols: [{
+ type: "align",
+ align: "c"
+ }],
+ addJot: !0,
+ colSeparationType: "gather",
+ autoTag: Qr(t.envName),
+ emptySingleRow: !0,
+ leqno: t.parser.settings.leqno
+ };
+ return A0(t.parser, e, "display");
+ },
+ htmlBuilder: Jt,
+ mathmlBuilder: $t
+ }), Qt({
+ type: "array",
+ names: ["alignat", "alignat*", "alignedat"],
+ props: {
+ numArgs: 1
+ },
+ handler: Mi,
+ htmlBuilder: Jt,
+ mathmlBuilder: $t
+ }), Qt({
+ type: "array",
+ names: ["equation", "equation*"],
+ props: {
+ numArgs: 0
+ },
+ handler(t) {
+ $n(t);
+ const e = {
+ autoTag: Qr(t.envName),
+ emptySingleRow: !0,
+ singleRow: !0,
+ maxNumCols: 1,
+ leqno: t.parser.settings.leqno
+ };
+ return A0(t.parser, e, "display");
+ },
+ htmlBuilder: Jt,
+ mathmlBuilder: $t
+ }), Qt({
+ type: "array",
+ names: ["CD"],
+ props: {
+ numArgs: 0
+ },
+ handler(t) {
+ return $n(t), Du(t.parser);
+ },
+ htmlBuilder: Jt,
+ mathmlBuilder: $t
+ }), k("\\nonumber", "\\gdef\\@eqnsw{0}"), k("\\notag", "\\nonumber"), ne({
+ type: "text",
+ // Doesn't matter what this is.
+ names: ["\\hline", "\\hdashline"],
+ props: {
+ numArgs: 0,
+ allowedInText: !0,
+ allowedInMath: !0
+ },
+ handler(t, e) {
+ throw new u(t.funcName + " valid only within array environment");
+ }
+ });
+ var zi = Ei;
+ ne({
+ type: "environment",
+ names: ["\\begin", "\\end"],
+ props: {
+ numArgs: 1,
+ argTypes: ["text"]
+ },
+ handler(t, e) {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = e[0];
+ if (c.type !== "ordgroup")
+ throw new u("Invalid environment name", c);
+ let m = "";
+ for (let b = 0; b < c.body.length; ++b)
+ m += pe(c.body[b], "textord").text;
+ if (l === "\\begin") {
+ if (!zi.hasOwnProperty(m))
+ throw new u("No such environment: " + m, c);
+ const b = zi[m], {
+ args: _,
+ optArgs: x
+ } = n.parseArguments("\\begin{" + m + "}", b), F = {
+ mode: n.mode,
+ envName: m,
+ parser: n
+ }, B = b.handler(F, _, x);
+ n.expect("\\end", !1);
+ const I = n.nextToken, q = pe(n.parseFunction(), "environment");
+ if (q.name !== m)
+ throw new u("Mismatch: \\begin{" + m + "} matched by \\end{" + q.name + "}", I);
+ return B;
+ }
+ return {
+ type: "environment",
+ mode: n.mode,
+ name: m,
+ nameGroup: c
+ };
+ }
+ });
+ const Bi = (t, e) => {
+ const n = t.font, l = e.withFont(n);
+ return ve(t.body, l);
+ }, Ni = (t, e) => {
+ const n = t.font, l = e.withFont(n);
+ return Ie(t.body, l);
+ }, Ri = {
+ "\\Bbb": "\\mathbb",
+ "\\bold": "\\mathbf",
+ "\\frak": "\\mathfrak",
+ "\\bm": "\\boldsymbol"
+ };
+ ne({
+ type: "font",
+ names: [
+ // styles, except \boldsymbol defined below
+ "\\mathrm",
+ "\\mathit",
+ "\\mathbf",
+ "\\mathnormal",
+ // families
+ "\\mathbb",
+ "\\mathcal",
+ "\\mathfrak",
+ "\\mathscr",
+ "\\mathsf",
+ "\\mathtt",
+ // aliases, except \bm defined below
+ "\\Bbb",
+ "\\bold",
+ "\\frak"
+ ],
+ props: {
+ numArgs: 1,
+ allowedInArgument: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = jn(e[0]);
+ let m = l;
+ return m in Ri && (m = Ri[m]), {
+ type: "font",
+ mode: n.mode,
+ font: m.slice(1),
+ body: c
+ };
+ },
+ htmlBuilder: Bi,
+ mathmlBuilder: Ni
+ }), ne({
+ type: "mclass",
+ names: ["\\boldsymbol", "\\bm"],
+ props: {
+ numArgs: 1
+ },
+ handler: (t, e) => {
+ let {
+ parser: n
+ } = t;
+ const l = e[0], c = R.isCharacterBox(l);
+ return {
+ type: "mclass",
+ mode: n.mode,
+ mclass: Kn(l),
+ body: [{
+ type: "font",
+ mode: n.mode,
+ font: "boldsymbol",
+ body: l
+ }],
+ isCharacterBox: c
+ };
+ }
+ }), ne({
+ type: "font",
+ names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it", "\\cal"],
+ props: {
+ numArgs: 0,
+ allowedInText: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n,
+ funcName: l,
+ breakOnTokenText: c
+ } = t;
+ const {
+ mode: m
+ } = n, b = n.parseExpression(!0, c), _ = "math" + l.slice(1);
+ return {
+ type: "font",
+ mode: m,
+ font: _,
+ body: {
+ type: "ordgroup",
+ mode: n.mode,
+ body: b
+ }
+ };
+ },
+ htmlBuilder: Bi,
+ mathmlBuilder: Ni
+ });
+ const Ii = (t, e) => {
+ let n = e;
+ return t === "display" ? n = n.id >= ae.SCRIPT.id ? n.text() : ae.DISPLAY : t === "text" && n.size === ae.DISPLAY.size ? n = ae.TEXT : t === "script" ? n = ae.SCRIPT : t === "scriptscript" && (n = ae.SCRIPTSCRIPT), n;
+ }, $r = (t, e) => {
+ const n = Ii(t.size, e.style), l = n.fracNum(), c = n.fracDen();
+ let m;
+ m = e.havingStyle(l);
+ const b = ve(t.numer, m, e);
+ if (t.continued) {
+ const De = 8.5 / e.fontMetrics().ptPerEm, Fe = 3.5 / e.fontMetrics().ptPerEm;
+ b.height = b.height < De ? De : b.height, b.depth = b.depth < Fe ? Fe : b.depth;
+ }
+ m = e.havingStyle(c);
+ const _ = ve(t.denom, m, e);
+ let x, F, B;
+ t.hasBarLine ? (t.barSize ? (F = Ne(t.barSize, e), x = O.makeLineSpan("frac-line", e, F)) : x = O.makeLineSpan("frac-line", e), F = x.height, B = x.height) : (x = null, F = 0, B = e.fontMetrics().defaultRuleThickness);
+ let I, q, W;
+ n.size === ae.DISPLAY.size || t.size === "display" ? (I = e.fontMetrics().num1, F > 0 ? q = 3 * B : q = 7 * B, W = e.fontMetrics().denom1) : (F > 0 ? (I = e.fontMetrics().num2, q = B) : (I = e.fontMetrics().num3, q = 3 * B), W = e.fontMetrics().denom2);
+ let se;
+ if (x) {
+ const De = e.fontMetrics().axisHeight;
+ I - b.depth - (De + 0.5 * F) < q && (I += q - (I - b.depth - (De + 0.5 * F))), De - 0.5 * F - (_.height - W) < q && (W += q - (De - 0.5 * F - (_.height - W)));
+ const Fe = -(De - 0.5 * F);
+ se = O.makeVList({
+ positionType: "individualShift",
+ children: [{
+ type: "elem",
+ elem: _,
+ shift: W
+ }, {
+ type: "elem",
+ elem: x,
+ shift: Fe
+ }, {
+ type: "elem",
+ elem: b,
+ shift: -I
+ }]
+ }, e);
+ } else {
+ const De = I - b.depth - (_.height - W);
+ De < q && (I += 0.5 * (q - De), W += 0.5 * (q - De)), se = O.makeVList({
+ positionType: "individualShift",
+ children: [{
+ type: "elem",
+ elem: _,
+ shift: W
+ }, {
+ type: "elem",
+ elem: b,
+ shift: -I
+ }]
+ }, e);
+ }
+ m = e.havingStyle(n), se.height *= m.sizeMultiplier / e.sizeMultiplier, se.depth *= m.sizeMultiplier / e.sizeMultiplier;
+ let ue;
+ n.size === ae.DISPLAY.size ? ue = e.fontMetrics().delim1 : n.size === ae.SCRIPTSCRIPT.size ? ue = e.havingStyle(ae.SCRIPT).fontMetrics().delim2 : ue = e.fontMetrics().delim2;
+ let xe, we;
+ return t.leftDelim == null ? xe = yn(e, ["mopen"]) : xe = d0.customSizedDelim(t.leftDelim, ue, !0, e.havingStyle(n), t.mode, ["mopen"]), t.continued ? we = O.makeSpan([]) : t.rightDelim == null ? we = yn(e, ["mclose"]) : we = d0.customSizedDelim(t.rightDelim, ue, !0, e.havingStyle(n), t.mode, ["mclose"]), O.makeSpan(["mord"].concat(m.sizingClasses(e)), [xe, O.makeSpan(["mfrac"], [se]), we], e);
+ }, es = (t, e) => {
+ let n = new Y.MathNode("mfrac", [Ie(t.numer, e), Ie(t.denom, e)]);
+ if (!t.hasBarLine)
+ n.setAttribute("linethickness", "0px");
+ else if (t.barSize) {
+ const c = Ne(t.barSize, e);
+ n.setAttribute("linethickness", $(c));
+ }
+ const l = Ii(t.size, e.style);
+ if (l.size !== e.style.size) {
+ n = new Y.MathNode("mstyle", [n]);
+ const c = l.size === ae.DISPLAY.size ? "true" : "false";
+ n.setAttribute("displaystyle", c), n.setAttribute("scriptlevel", "0");
+ }
+ if (t.leftDelim != null || t.rightDelim != null) {
+ const c = [];
+ if (t.leftDelim != null) {
+ const m = new Y.MathNode("mo", [new Y.TextNode(t.leftDelim.replace("\\", ""))]);
+ m.setAttribute("fence", "true"), c.push(m);
+ }
+ if (c.push(n), t.rightDelim != null) {
+ const m = new Y.MathNode("mo", [new Y.TextNode(t.rightDelim.replace("\\", ""))]);
+ m.setAttribute("fence", "true"), c.push(m);
+ }
+ return Lr(c);
+ }
+ return n;
+ };
+ ne({
+ type: "genfrac",
+ names: [
+ "\\dfrac",
+ "\\frac",
+ "\\tfrac",
+ "\\dbinom",
+ "\\binom",
+ "\\tbinom",
+ "\\\\atopfrac",
+ // can’t be entered directly
+ "\\\\bracefrac",
+ "\\\\brackfrac"
+ // ditto
+ ],
+ props: {
+ numArgs: 2,
+ allowedInArgument: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = e[0], m = e[1];
+ let b, _ = null, x = null, F = "auto";
+ switch (l) {
+ case "\\dfrac":
+ case "\\frac":
+ case "\\tfrac":
+ b = !0;
+ break;
+ case "\\\\atopfrac":
+ b = !1;
+ break;
+ case "\\dbinom":
+ case "\\binom":
+ case "\\tbinom":
+ b = !1, _ = "(", x = ")";
+ break;
+ case "\\\\bracefrac":
+ b = !1, _ = "\\{", x = "\\}";
+ break;
+ case "\\\\brackfrac":
+ b = !1, _ = "[", x = "]";
+ break;
+ default:
+ throw new Error("Unrecognized genfrac command");
+ }
+ switch (l) {
+ case "\\dfrac":
+ case "\\dbinom":
+ F = "display";
+ break;
+ case "\\tfrac":
+ case "\\tbinom":
+ F = "text";
+ break;
+ }
+ return {
+ type: "genfrac",
+ mode: n.mode,
+ continued: !1,
+ numer: c,
+ denom: m,
+ hasBarLine: b,
+ leftDelim: _,
+ rightDelim: x,
+ size: F,
+ barSize: null
+ };
+ },
+ htmlBuilder: $r,
+ mathmlBuilder: es
+ }), ne({
+ type: "genfrac",
+ names: ["\\cfrac"],
+ props: {
+ numArgs: 2
+ },
+ handler: (t, e) => {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = e[0], m = e[1];
+ return {
+ type: "genfrac",
+ mode: n.mode,
+ continued: !0,
+ numer: c,
+ denom: m,
+ hasBarLine: !0,
+ leftDelim: null,
+ rightDelim: null,
+ size: "display",
+ barSize: null
+ };
+ }
+ }), ne({
+ type: "infix",
+ names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"],
+ props: {
+ numArgs: 0,
+ infix: !0
+ },
+ handler(t) {
+ let {
+ parser: e,
+ funcName: n,
+ token: l
+ } = t, c;
+ switch (n) {
+ case "\\over":
+ c = "\\frac";
+ break;
+ case "\\choose":
+ c = "\\binom";
+ break;
+ case "\\atop":
+ c = "\\\\atopfrac";
+ break;
+ case "\\brace":
+ c = "\\\\bracefrac";
+ break;
+ case "\\brack":
+ c = "\\\\brackfrac";
+ break;
+ default:
+ throw new Error("Unrecognized infix genfrac command");
+ }
+ return {
+ type: "infix",
+ mode: e.mode,
+ replaceWith: c,
+ token: l
+ };
+ }
+ });
+ const Li = ["display", "text", "script", "scriptscript"], Oi = function(t) {
+ let e = null;
+ return t.length > 0 && (e = t, e = e === "." ? null : e), e;
+ };
+ ne({
+ type: "genfrac",
+ names: ["\\genfrac"],
+ props: {
+ numArgs: 6,
+ allowedInArgument: !0,
+ argTypes: ["math", "math", "size", "text", "math", "math"]
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ const l = e[4], c = e[5], m = jn(e[0]), b = m.type === "atom" && m.family === "open" ? Oi(m.text) : null, _ = jn(e[1]), x = _.type === "atom" && _.family === "close" ? Oi(_.text) : null, F = pe(e[2], "size");
+ let B, I = null;
+ F.isBlank ? B = !0 : (I = F.value, B = I.number > 0);
+ let q = "auto", W = e[3];
+ if (W.type === "ordgroup") {
+ if (W.body.length > 0) {
+ const se = pe(W.body[0], "textord");
+ q = Li[Number(se.text)];
+ }
+ } else
+ W = pe(W, "textord"), q = Li[Number(W.text)];
+ return {
+ type: "genfrac",
+ mode: n.mode,
+ numer: l,
+ denom: c,
+ continued: !1,
+ hasBarLine: B,
+ barSize: I,
+ leftDelim: b,
+ rightDelim: x,
+ size: q
+ };
+ },
+ htmlBuilder: $r,
+ mathmlBuilder: es
+ }), ne({
+ type: "infix",
+ names: ["\\above"],
+ props: {
+ numArgs: 1,
+ argTypes: ["size"],
+ infix: !0
+ },
+ handler(t, e) {
+ let {
+ parser: n,
+ funcName: l,
+ token: c
+ } = t;
+ return {
+ type: "infix",
+ mode: n.mode,
+ replaceWith: "\\\\abovefrac",
+ size: pe(e[0], "size").value,
+ token: c
+ };
+ }
+ }), ne({
+ type: "genfrac",
+ names: ["\\\\abovefrac"],
+ props: {
+ numArgs: 3,
+ argTypes: ["math", "size", "math"]
+ },
+ handler: (t, e) => {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = e[0], m = ee(pe(e[1], "infix").size), b = e[2], _ = m.number > 0;
+ return {
+ type: "genfrac",
+ mode: n.mode,
+ numer: c,
+ denom: b,
+ continued: !1,
+ hasBarLine: _,
+ barSize: m,
+ leftDelim: null,
+ rightDelim: null,
+ size: "auto"
+ };
+ },
+ htmlBuilder: $r,
+ mathmlBuilder: es
+ });
+ const qi = (t, e) => {
+ const n = e.style;
+ let l, c;
+ t.type === "supsub" ? (l = t.sup ? ve(t.sup, e.havingStyle(n.sup()), e) : ve(t.sub, e.havingStyle(n.sub()), e), c = pe(t.base, "horizBrace")) : c = pe(t, "horizBrace");
+ const m = ve(c.base, e.havingBaseStyle(ae.DISPLAY)), b = f0.svgSpan(c, e);
+ let _;
+ if (c.isOver ? (_ = O.makeVList({
+ positionType: "firstBaseline",
+ children: [{
+ type: "elem",
+ elem: m
+ }, {
+ type: "kern",
+ size: 0.1
+ }, {
+ type: "elem",
+ elem: b
+ }]
+ }, e), _.children[0].children[0].children[1].classes.push("svg-align")) : (_ = O.makeVList({
+ positionType: "bottom",
+ positionData: m.depth + 0.1 + b.height,
+ children: [{
+ type: "elem",
+ elem: b
+ }, {
+ type: "kern",
+ size: 0.1
+ }, {
+ type: "elem",
+ elem: m
+ }]
+ }, e), _.children[0].children[0].children[0].classes.push("svg-align")), l) {
+ const x = O.makeSpan(["mord", c.isOver ? "mover" : "munder"], [_], e);
+ c.isOver ? _ = O.makeVList({
+ positionType: "firstBaseline",
+ children: [{
+ type: "elem",
+ elem: x
+ }, {
+ type: "kern",
+ size: 0.2
+ }, {
+ type: "elem",
+ elem: l
+ }]
+ }, e) : _ = O.makeVList({
+ positionType: "bottom",
+ positionData: x.depth + 0.2 + l.height + l.depth,
+ children: [{
+ type: "elem",
+ elem: l
+ }, {
+ type: "kern",
+ size: 0.2
+ }, {
+ type: "elem",
+ elem: x
+ }]
+ }, e);
+ }
+ return O.makeSpan(["mord", c.isOver ? "mover" : "munder"], [_], e);
+ };
+ ne({
+ type: "horizBrace",
+ names: ["\\overbrace", "\\underbrace"],
+ props: {
+ numArgs: 1
+ },
+ handler(t, e) {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ return {
+ type: "horizBrace",
+ mode: n.mode,
+ label: l,
+ isOver: /^\\over/.test(l),
+ base: e[0]
+ };
+ },
+ htmlBuilder: qi,
+ mathmlBuilder: (t, e) => {
+ const n = f0.mathMLnode(t.label);
+ return new Y.MathNode(t.isOver ? "mover" : "munder", [Ie(t.base, e), n]);
+ }
+ }), ne({
+ type: "href",
+ names: ["\\href"],
+ props: {
+ numArgs: 2,
+ argTypes: ["url", "original"],
+ allowedInText: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n
+ } = t;
+ const l = e[1], c = pe(e[0], "url").url;
+ return n.settings.isTrusted({
+ command: "\\href",
+ url: c
+ }) ? {
+ type: "href",
+ mode: n.mode,
+ href: c,
+ body: Ze(l)
+ } : n.formatUnsupportedCmd("\\href");
+ },
+ htmlBuilder: (t, e) => {
+ const n = Je(t.body, e, !1);
+ return O.makeAnchor(t.href, [], n, e);
+ },
+ mathmlBuilder: (t, e) => {
+ let n = v0(t.body, e);
+ return n instanceof Ft || (n = new Ft("mrow", [n])), n.setAttribute("href", t.href), n;
+ }
+ }), ne({
+ type: "href",
+ names: ["\\url"],
+ props: {
+ numArgs: 1,
+ argTypes: ["url"],
+ allowedInText: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n
+ } = t;
+ const l = pe(e[0], "url").url;
+ if (!n.settings.isTrusted({
+ command: "\\url",
+ url: l
+ }))
+ return n.formatUnsupportedCmd("\\url");
+ const c = [];
+ for (let b = 0; b < l.length; b++) {
+ let _ = l[b];
+ _ === "~" && (_ = "\\textasciitilde"), c.push({
+ type: "textord",
+ mode: "text",
+ text: _
+ });
+ }
+ const m = {
+ type: "text",
+ mode: n.mode,
+ font: "\\texttt",
+ body: c
+ };
+ return {
+ type: "href",
+ mode: n.mode,
+ href: l,
+ body: Ze(m)
+ };
+ }
+ }), ne({
+ type: "hbox",
+ names: ["\\hbox"],
+ props: {
+ numArgs: 1,
+ argTypes: ["text"],
+ allowedInText: !0,
+ primitive: !0
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ return {
+ type: "hbox",
+ mode: n.mode,
+ body: Ze(e[0])
+ };
+ },
+ htmlBuilder(t, e) {
+ const n = Je(t.body, e, !1);
+ return O.makeFragment(n);
+ },
+ mathmlBuilder(t, e) {
+ return new Y.MathNode("mrow", dt(t.body, e));
+ }
+ }), ne({
+ type: "html",
+ names: ["\\htmlClass", "\\htmlId", "\\htmlStyle", "\\htmlData"],
+ props: {
+ numArgs: 2,
+ argTypes: ["raw", "original"],
+ allowedInText: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n,
+ funcName: l,
+ token: c
+ } = t;
+ const m = pe(e[0], "raw").string, b = e[1];
+ n.settings.strict && n.settings.reportNonstrict("htmlExtension", "HTML extension is disabled on strict mode");
+ let _;
+ const x = {};
+ switch (l) {
+ case "\\htmlClass":
+ x.class = m, _ = {
+ command: "\\htmlClass",
+ class: m
+ };
+ break;
+ case "\\htmlId":
+ x.id = m, _ = {
+ command: "\\htmlId",
+ id: m
+ };
+ break;
+ case "\\htmlStyle":
+ x.style = m, _ = {
+ command: "\\htmlStyle",
+ style: m
+ };
+ break;
+ case "\\htmlData": {
+ const F = m.split(",");
+ for (let B = 0; B < F.length; B++) {
+ const I = F[B].split("=");
+ if (I.length !== 2)
+ throw new u("Error parsing key-value for \\htmlData");
+ x["data-" + I[0].trim()] = I[1].trim();
+ }
+ _ = {
+ command: "\\htmlData",
+ attributes: x
+ };
+ break;
+ }
+ default:
+ throw new Error("Unrecognized html command");
+ }
+ return n.settings.isTrusted(_) ? {
+ type: "html",
+ mode: n.mode,
+ attributes: x,
+ body: Ze(b)
+ } : n.formatUnsupportedCmd(l);
+ },
+ htmlBuilder: (t, e) => {
+ const n = Je(t.body, e, !1), l = ["enclosing"];
+ t.attributes.class && l.push(...t.attributes.class.trim().split(/\s+/));
+ const c = O.makeSpan(l, n, e);
+ for (const m in t.attributes)
+ m !== "class" && t.attributes.hasOwnProperty(m) && c.setAttribute(m, t.attributes[m]);
+ return c;
+ },
+ mathmlBuilder: (t, e) => v0(t.body, e)
+ }), ne({
+ type: "htmlmathml",
+ names: ["\\html@mathml"],
+ props: {
+ numArgs: 2,
+ allowedInText: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n
+ } = t;
+ return {
+ type: "htmlmathml",
+ mode: n.mode,
+ html: Ze(e[0]),
+ mathml: Ze(e[1])
+ };
+ },
+ htmlBuilder: (t, e) => {
+ const n = Je(t.html, e, !1);
+ return O.makeFragment(n);
+ },
+ mathmlBuilder: (t, e) => v0(t.mathml, e)
+ });
+ const ts = function(t) {
+ if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(t))
+ return {
+ number: +t,
+ unit: "bp"
+ };
+ {
+ const e = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(t);
+ if (!e)
+ throw new u("Invalid size: '" + t + "' in \\includegraphics");
+ const n = {
+ number: +(e[1] + e[2]),
+ // sign + magnitude, cast to number
+ unit: e[3]
+ };
+ if (!u0(n))
+ throw new u("Invalid unit: '" + n.unit + "' in \\includegraphics.");
+ return n;
+ }
+ };
+ ne({
+ type: "includegraphics",
+ names: ["\\includegraphics"],
+ props: {
+ numArgs: 1,
+ numOptionalArgs: 1,
+ argTypes: ["raw", "url"],
+ allowedInText: !1
+ },
+ handler: (t, e, n) => {
+ let {
+ parser: l
+ } = t, c = {
+ number: 0,
+ unit: "em"
+ }, m = {
+ number: 0.9,
+ unit: "em"
+ }, b = {
+ number: 0,
+ unit: "em"
+ }, _ = "";
+ if (n[0]) {
+ const B = pe(n[0], "raw").string.split(",");
+ for (let I = 0; I < B.length; I++) {
+ const q = B[I].split("=");
+ if (q.length === 2) {
+ const W = q[1].trim();
+ switch (q[0].trim()) {
+ case "alt":
+ _ = W;
+ break;
+ case "width":
+ c = ts(W);
+ break;
+ case "height":
+ m = ts(W);
+ break;
+ case "totalheight":
+ b = ts(W);
+ break;
+ default:
+ throw new u("Invalid key: '" + q[0] + "' in \\includegraphics.");
+ }
+ }
+ }
+ }
+ const x = pe(e[0], "url").url;
+ return _ === "" && (_ = x, _ = _.replace(/^.*[\\/]/, ""), _ = _.substring(0, _.lastIndexOf("."))), l.settings.isTrusted({
+ command: "\\includegraphics",
+ url: x
+ }) ? {
+ type: "includegraphics",
+ mode: l.mode,
+ alt: _,
+ width: c,
+ height: m,
+ totalheight: b,
+ src: x
+ } : l.formatUnsupportedCmd("\\includegraphics");
+ },
+ htmlBuilder: (t, e) => {
+ const n = Ne(t.height, e);
+ let l = 0;
+ t.totalheight.number > 0 && (l = Ne(t.totalheight, e) - n);
+ let c = 0;
+ t.width.number > 0 && (c = Ne(t.width, e));
+ const m = {
+ height: $(n + l)
+ };
+ c > 0 && (m.width = $(c)), l > 0 && (m.verticalAlign = $(-l));
+ const b = new Tr(t.src, t.alt, m);
+ return b.height = n, b.depth = l, b;
+ },
+ mathmlBuilder: (t, e) => {
+ const n = new Y.MathNode("mglyph", []);
+ n.setAttribute("alt", t.alt);
+ const l = Ne(t.height, e);
+ let c = 0;
+ if (t.totalheight.number > 0 && (c = Ne(t.totalheight, e) - l, n.setAttribute("valign", $(-c))), n.setAttribute("height", $(l + c)), t.width.number > 0) {
+ const m = Ne(t.width, e);
+ n.setAttribute("width", $(m));
+ }
+ return n.setAttribute("src", t.src), n;
+ }
+ }), ne({
+ type: "kern",
+ names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"],
+ props: {
+ numArgs: 1,
+ argTypes: ["size"],
+ primitive: !0,
+ allowedInText: !0
+ },
+ handler(t, e) {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = pe(e[0], "size");
+ if (n.settings.strict) {
+ const m = l[1] === "m", b = c.value.unit === "mu";
+ m ? (b || n.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + l + " supports only mu units, " + ("not " + c.value.unit + " units")), n.mode !== "math" && n.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + l + " works only in math mode")) : b && n.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + l + " doesn't support mu units");
+ }
+ return {
+ type: "kern",
+ mode: n.mode,
+ dimension: c.value
+ };
+ },
+ htmlBuilder(t, e) {
+ return O.makeGlue(t.dimension, e);
+ },
+ mathmlBuilder(t, e) {
+ const n = Ne(t.dimension, e);
+ return new Y.SpaceNode(n);
+ }
+ }), ne({
+ type: "lap",
+ names: ["\\mathllap", "\\mathrlap", "\\mathclap"],
+ props: {
+ numArgs: 1,
+ allowedInText: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = e[0];
+ return {
+ type: "lap",
+ mode: n.mode,
+ alignment: l.slice(5),
+ body: c
+ };
+ },
+ htmlBuilder: (t, e) => {
+ let n;
+ t.alignment === "clap" ? (n = O.makeSpan([], [ve(t.body, e)]), n = O.makeSpan(["inner"], [n], e)) : n = O.makeSpan(["inner"], [ve(t.body, e)]);
+ const l = O.makeSpan(["fix"], []);
+ let c = O.makeSpan([t.alignment], [n, l], e);
+ const m = O.makeSpan(["strut"]);
+ return m.style.height = $(c.height + c.depth), c.depth && (m.style.verticalAlign = $(-c.depth)), c.children.unshift(m), c = O.makeSpan(["thinbox"], [c], e), O.makeSpan(["mord", "vbox"], [c], e);
+ },
+ mathmlBuilder: (t, e) => {
+ const n = new Y.MathNode("mpadded", [Ie(t.body, e)]);
+ if (t.alignment !== "rlap") {
+ const l = t.alignment === "llap" ? "-1" : "-0.5";
+ n.setAttribute("lspace", l + "width");
+ }
+ return n.setAttribute("width", "0px"), n;
+ }
+ }), ne({
+ type: "styling",
+ names: ["\\(", "$"],
+ props: {
+ numArgs: 0,
+ allowedInText: !0,
+ allowedInMath: !1
+ },
+ handler(t, e) {
+ let {
+ funcName: n,
+ parser: l
+ } = t;
+ const c = l.mode;
+ l.switchMode("math");
+ const m = n === "\\(" ? "\\)" : "$", b = l.parseExpression(!1, m);
+ return l.expect(m), l.switchMode(c), {
+ type: "styling",
+ mode: l.mode,
+ style: "text",
+ body: b
+ };
+ }
+ }), ne({
+ type: "text",
+ // Doesn't matter what this is.
+ names: ["\\)", "\\]"],
+ props: {
+ numArgs: 0,
+ allowedInText: !0,
+ allowedInMath: !1
+ },
+ handler(t, e) {
+ throw new u("Mismatched " + t.funcName);
+ }
+ });
+ const Pi = (t, e) => {
+ switch (e.style.size) {
+ case ae.DISPLAY.size:
+ return t.display;
+ case ae.TEXT.size:
+ return t.text;
+ case ae.SCRIPT.size:
+ return t.script;
+ case ae.SCRIPTSCRIPT.size:
+ return t.scriptscript;
+ default:
+ return t.text;
+ }
+ };
+ ne({
+ type: "mathchoice",
+ names: ["\\mathchoice"],
+ props: {
+ numArgs: 4,
+ primitive: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n
+ } = t;
+ return {
+ type: "mathchoice",
+ mode: n.mode,
+ display: Ze(e[0]),
+ text: Ze(e[1]),
+ script: Ze(e[2]),
+ scriptscript: Ze(e[3])
+ };
+ },
+ htmlBuilder: (t, e) => {
+ const n = Pi(t, e), l = Je(n, e, !1);
+ return O.makeFragment(l);
+ },
+ mathmlBuilder: (t, e) => {
+ const n = Pi(t, e);
+ return v0(n, e);
+ }
+ });
+ const Hi = (t, e, n, l, c, m, b) => {
+ t = O.makeSpan([], [t]);
+ const _ = n && R.isCharacterBox(n);
+ let x, F;
+ if (e) {
+ const q = ve(e, l.havingStyle(c.sup()), l);
+ F = {
+ elem: q,
+ kern: Math.max(l.fontMetrics().bigOpSpacing1, l.fontMetrics().bigOpSpacing3 - q.depth)
+ };
+ }
+ if (n) {
+ const q = ve(n, l.havingStyle(c.sub()), l);
+ x = {
+ elem: q,
+ kern: Math.max(l.fontMetrics().bigOpSpacing2, l.fontMetrics().bigOpSpacing4 - q.height)
+ };
+ }
+ let B;
+ if (F && x) {
+ const q = l.fontMetrics().bigOpSpacing5 + x.elem.height + x.elem.depth + x.kern + t.depth + b;
+ B = O.makeVList({
+ positionType: "bottom",
+ positionData: q,
+ children: [{
+ type: "kern",
+ size: l.fontMetrics().bigOpSpacing5
+ }, {
+ type: "elem",
+ elem: x.elem,
+ marginLeft: $(-m)
+ }, {
+ type: "kern",
+ size: x.kern
+ }, {
+ type: "elem",
+ elem: t
+ }, {
+ type: "kern",
+ size: F.kern
+ }, {
+ type: "elem",
+ elem: F.elem,
+ marginLeft: $(m)
+ }, {
+ type: "kern",
+ size: l.fontMetrics().bigOpSpacing5
+ }]
+ }, l);
+ } else if (x) {
+ const q = t.height - b;
+ B = O.makeVList({
+ positionType: "top",
+ positionData: q,
+ children: [{
+ type: "kern",
+ size: l.fontMetrics().bigOpSpacing5
+ }, {
+ type: "elem",
+ elem: x.elem,
+ marginLeft: $(-m)
+ }, {
+ type: "kern",
+ size: x.kern
+ }, {
+ type: "elem",
+ elem: t
+ }]
+ }, l);
+ } else if (F) {
+ const q = t.depth + b;
+ B = O.makeVList({
+ positionType: "bottom",
+ positionData: q,
+ children: [{
+ type: "elem",
+ elem: t
+ }, {
+ type: "kern",
+ size: F.kern
+ }, {
+ type: "elem",
+ elem: F.elem,
+ marginLeft: $(m)
+ }, {
+ type: "kern",
+ size: l.fontMetrics().bigOpSpacing5
+ }]
+ }, l);
+ } else
+ return t;
+ const I = [B];
+ if (x && m !== 0 && !_) {
+ const q = O.makeSpan(["mspace"], [], l);
+ q.style.marginRight = $(m), I.unshift(q);
+ }
+ return O.makeSpan(["mop", "op-limits"], I, l);
+ }, Ui = ["\\smallint"], nn = (t, e) => {
+ let n, l, c = !1, m;
+ t.type === "supsub" ? (n = t.sup, l = t.sub, m = pe(t.base, "op"), c = !0) : m = pe(t, "op");
+ const b = e.style;
+ let _ = !1;
+ b.size === ae.DISPLAY.size && m.symbol && !R.contains(Ui, m.name) && (_ = !0);
+ let x;
+ if (m.symbol) {
+ const I = _ ? "Size2-Regular" : "Size1-Regular";
+ let q = "";
+ if ((m.name === "\\oiint" || m.name === "\\oiiint") && (q = m.name.slice(1), m.name = q === "oiint" ? "\\iint" : "\\iiint"), x = O.makeSymbol(m.name, I, "math", e, ["mop", "op-symbol", _ ? "large-op" : "small-op"]), q.length > 0) {
+ const W = x.italic, se = O.staticSvg(q + "Size" + (_ ? "2" : "1"), e);
+ x = O.makeVList({
+ positionType: "individualShift",
+ children: [{
+ type: "elem",
+ elem: x,
+ shift: 0
+ }, {
+ type: "elem",
+ elem: se,
+ shift: _ ? 0.08 : 0
+ }]
+ }, e), m.name = "\\" + q, x.classes.unshift("mop"), x.italic = W;
+ }
+ } else if (m.body) {
+ const I = Je(m.body, e, !0);
+ I.length === 1 && I[0] instanceof st ? (x = I[0], x.classes[0] = "mop") : x = O.makeSpan(["mop"], I, e);
+ } else {
+ const I = [];
+ for (let q = 1; q < m.name.length; q++)
+ I.push(O.mathsym(m.name[q], m.mode, e));
+ x = O.makeSpan(["mop"], I, e);
+ }
+ let F = 0, B = 0;
+ return (x instanceof st || m.name === "\\oiint" || m.name === "\\oiiint") && !m.suppressBaseShift && (F = (x.height - x.depth) / 2 - e.fontMetrics().axisHeight, B = x.italic), c ? Hi(x, n, l, e, b, B, F) : (F && (x.style.position = "relative", x.style.top = $(F)), x);
+ }, Dn = (t, e) => {
+ let n;
+ if (t.symbol)
+ n = new Ft("mo", [Et(t.name, t.mode)]), R.contains(Ui, t.name) && n.setAttribute("largeop", "false");
+ else if (t.body)
+ n = new Ft("mo", dt(t.body, e));
+ else {
+ n = new Ft("mi", [new _n(t.name.slice(1))]);
+ const l = new Ft("mo", [Et("", "text")]);
+ t.parentIsSupSub ? n = new Ft("mrow", [n, l]) : n = ii([n, l]);
+ }
+ return n;
+ }, Lu = {
+ "∏": "\\prod",
+ "∐": "\\coprod",
+ "∑": "\\sum",
+ "⋀": "\\bigwedge",
+ "⋁": "\\bigvee",
+ "⋂": "\\bigcap",
+ "⋃": "\\bigcup",
+ "⨀": "\\bigodot",
+ "⨁": "\\bigoplus",
+ "⨂": "\\bigotimes",
+ "⨄": "\\biguplus",
+ "⨆": "\\bigsqcup"
+ };
+ ne({
+ type: "op",
+ names: ["\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap", "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes", "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint", "∏", "∐", "∑", "⋀", "⋁", "⋂", "⋃", "⨀", "⨁", "⨂", "⨄", "⨆"],
+ props: {
+ numArgs: 0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n,
+ funcName: l
+ } = t, c = l;
+ return c.length === 1 && (c = Lu[c]), {
+ type: "op",
+ mode: n.mode,
+ limits: !0,
+ parentIsSupSub: !1,
+ symbol: !0,
+ name: c
+ };
+ },
+ htmlBuilder: nn,
+ mathmlBuilder: Dn
+ }), ne({
+ type: "op",
+ names: ["\\mathop"],
+ props: {
+ numArgs: 1,
+ primitive: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n
+ } = t;
+ const l = e[0];
+ return {
+ type: "op",
+ mode: n.mode,
+ limits: !1,
+ parentIsSupSub: !1,
+ symbol: !1,
+ body: Ze(l)
+ };
+ },
+ htmlBuilder: nn,
+ mathmlBuilder: Dn
+ });
+ const Ou = {
+ "∫": "\\int",
+ "∬": "\\iint",
+ "∭": "\\iiint",
+ "∮": "\\oint",
+ "∯": "\\oiint",
+ "∰": "\\oiiint"
+ };
+ ne({
+ type: "op",
+ names: ["\\arcsin", "\\arccos", "\\arctan", "\\arctg", "\\arcctg", "\\arg", "\\ch", "\\cos", "\\cosec", "\\cosh", "\\cot", "\\cotg", "\\coth", "\\csc", "\\ctg", "\\cth", "\\deg", "\\dim", "\\exp", "\\hom", "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh", "\\sh", "\\tan", "\\tanh", "\\tg", "\\th"],
+ props: {
+ numArgs: 0
+ },
+ handler(t) {
+ let {
+ parser: e,
+ funcName: n
+ } = t;
+ return {
+ type: "op",
+ mode: e.mode,
+ limits: !1,
+ parentIsSupSub: !1,
+ symbol: !1,
+ name: n
+ };
+ },
+ htmlBuilder: nn,
+ mathmlBuilder: Dn
+ }), ne({
+ type: "op",
+ names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"],
+ props: {
+ numArgs: 0
+ },
+ handler(t) {
+ let {
+ parser: e,
+ funcName: n
+ } = t;
+ return {
+ type: "op",
+ mode: e.mode,
+ limits: !0,
+ parentIsSupSub: !1,
+ symbol: !1,
+ name: n
+ };
+ },
+ htmlBuilder: nn,
+ mathmlBuilder: Dn
+ }), ne({
+ type: "op",
+ names: ["\\int", "\\iint", "\\iiint", "\\oint", "\\oiint", "\\oiiint", "∫", "∬", "∭", "∮", "∯", "∰"],
+ props: {
+ numArgs: 0
+ },
+ handler(t) {
+ let {
+ parser: e,
+ funcName: n
+ } = t, l = n;
+ return l.length === 1 && (l = Ou[l]), {
+ type: "op",
+ mode: e.mode,
+ limits: !1,
+ parentIsSupSub: !1,
+ symbol: !0,
+ name: l
+ };
+ },
+ htmlBuilder: nn,
+ mathmlBuilder: Dn
+ });
+ const Gi = (t, e) => {
+ let n, l, c = !1, m;
+ t.type === "supsub" ? (n = t.sup, l = t.sub, m = pe(t.base, "operatorname"), c = !0) : m = pe(t, "operatorname");
+ let b;
+ if (m.body.length > 0) {
+ const _ = m.body.map((F) => {
+ const B = F.text;
+ return typeof B == "string" ? {
+ type: "textord",
+ mode: F.mode,
+ text: B
+ } : F;
+ }), x = Je(_, e.withFont("mathrm"), !0);
+ for (let F = 0; F < x.length; F++) {
+ const B = x[F];
+ B instanceof st && (B.text = B.text.replace(/\u2212/, "-").replace(/\u2217/, "*"));
+ }
+ b = O.makeSpan(["mop"], x, e);
+ } else
+ b = O.makeSpan(["mop"], [], e);
+ return c ? Hi(b, n, l, e, e.style, 0, 0) : b;
+ };
+ ne({
+ type: "operatorname",
+ names: ["\\operatorname@", "\\operatornamewithlimits"],
+ props: {
+ numArgs: 1
+ },
+ handler: (t, e) => {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = e[0];
+ return {
+ type: "operatorname",
+ mode: n.mode,
+ body: Ze(c),
+ alwaysHandleSupSub: l === "\\operatornamewithlimits",
+ limits: !1,
+ parentIsSupSub: !1
+ };
+ },
+ htmlBuilder: Gi,
+ mathmlBuilder: (t, e) => {
+ let n = dt(t.body, e.withFont("mathrm")), l = !0;
+ for (let b = 0; b < n.length; b++) {
+ const _ = n[b];
+ if (!(_ instanceof Y.SpaceNode))
+ if (_ instanceof Y.MathNode)
+ switch (_.type) {
+ case "mi":
+ case "mn":
+ case "ms":
+ case "mspace":
+ case "mtext":
+ break;
+ case "mo": {
+ const x = _.children[0];
+ _.children.length === 1 && x instanceof Y.TextNode ? x.text = x.text.replace(/\u2212/, "-").replace(/\u2217/, "*") : l = !1;
+ break;
+ }
+ default:
+ l = !1;
+ }
+ else
+ l = !1;
+ }
+ if (l) {
+ const b = n.map((_) => _.toText()).join("");
+ n = [new Y.TextNode(b)];
+ }
+ const c = new Y.MathNode("mi", n);
+ c.setAttribute("mathvariant", "normal");
+ const m = new Y.MathNode("mo", [Et("", "text")]);
+ return t.parentIsSupSub ? new Y.MathNode("mrow", [c, m]) : Y.newDocumentFragment([c, m]);
+ }
+ }), k("\\operatorname", "\\@ifstar\\operatornamewithlimits\\operatorname@"), P0({
+ type: "ordgroup",
+ htmlBuilder(t, e) {
+ return t.semisimple ? O.makeFragment(Je(t.body, e, !1)) : O.makeSpan(["mord"], Je(t.body, e, !0), e);
+ },
+ mathmlBuilder(t, e) {
+ return v0(t.body, e, !0);
+ }
+ }), ne({
+ type: "overline",
+ names: ["\\overline"],
+ props: {
+ numArgs: 1
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ const l = e[0];
+ return {
+ type: "overline",
+ mode: n.mode,
+ body: l
+ };
+ },
+ htmlBuilder(t, e) {
+ const n = ve(t.body, e.havingCrampedStyle()), l = O.makeLineSpan("overline-line", e), c = e.fontMetrics().defaultRuleThickness, m = O.makeVList({
+ positionType: "firstBaseline",
+ children: [{
+ type: "elem",
+ elem: n
+ }, {
+ type: "kern",
+ size: 3 * c
+ }, {
+ type: "elem",
+ elem: l
+ }, {
+ type: "kern",
+ size: c
+ }]
+ }, e);
+ return O.makeSpan(["mord", "overline"], [m], e);
+ },
+ mathmlBuilder(t, e) {
+ const n = new Y.MathNode("mo", [new Y.TextNode("‾")]);
+ n.setAttribute("stretchy", "true");
+ const l = new Y.MathNode("mover", [Ie(t.body, e), n]);
+ return l.setAttribute("accent", "true"), l;
+ }
+ }), ne({
+ type: "phantom",
+ names: ["\\phantom"],
+ props: {
+ numArgs: 1,
+ allowedInText: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n
+ } = t;
+ const l = e[0];
+ return {
+ type: "phantom",
+ mode: n.mode,
+ body: Ze(l)
+ };
+ },
+ htmlBuilder: (t, e) => {
+ const n = Je(t.body, e.withPhantom(), !1);
+ return O.makeFragment(n);
+ },
+ mathmlBuilder: (t, e) => {
+ const n = dt(t.body, e);
+ return new Y.MathNode("mphantom", n);
+ }
+ }), ne({
+ type: "hphantom",
+ names: ["\\hphantom"],
+ props: {
+ numArgs: 1,
+ allowedInText: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n
+ } = t;
+ const l = e[0];
+ return {
+ type: "hphantom",
+ mode: n.mode,
+ body: l
+ };
+ },
+ htmlBuilder: (t, e) => {
+ let n = O.makeSpan([], [ve(t.body, e.withPhantom())]);
+ if (n.height = 0, n.depth = 0, n.children)
+ for (let l = 0; l < n.children.length; l++)
+ n.children[l].height = 0, n.children[l].depth = 0;
+ return n = O.makeVList({
+ positionType: "firstBaseline",
+ children: [{
+ type: "elem",
+ elem: n
+ }]
+ }, e), O.makeSpan(["mord"], [n], e);
+ },
+ mathmlBuilder: (t, e) => {
+ const n = dt(Ze(t.body), e), l = new Y.MathNode("mphantom", n), c = new Y.MathNode("mpadded", [l]);
+ return c.setAttribute("height", "0px"), c.setAttribute("depth", "0px"), c;
+ }
+ }), ne({
+ type: "vphantom",
+ names: ["\\vphantom"],
+ props: {
+ numArgs: 1,
+ allowedInText: !0
+ },
+ handler: (t, e) => {
+ let {
+ parser: n
+ } = t;
+ const l = e[0];
+ return {
+ type: "vphantom",
+ mode: n.mode,
+ body: l
+ };
+ },
+ htmlBuilder: (t, e) => {
+ const n = O.makeSpan(["inner"], [ve(t.body, e.withPhantom())]), l = O.makeSpan(["fix"], []);
+ return O.makeSpan(["mord", "rlap"], [n, l], e);
+ },
+ mathmlBuilder: (t, e) => {
+ const n = dt(Ze(t.body), e), l = new Y.MathNode("mphantom", n), c = new Y.MathNode("mpadded", [l]);
+ return c.setAttribute("width", "0px"), c;
+ }
+ }), ne({
+ type: "raisebox",
+ names: ["\\raisebox"],
+ props: {
+ numArgs: 2,
+ argTypes: ["size", "hbox"],
+ allowedInText: !0
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ const l = pe(e[0], "size").value, c = e[1];
+ return {
+ type: "raisebox",
+ mode: n.mode,
+ dy: l,
+ body: c
+ };
+ },
+ htmlBuilder(t, e) {
+ const n = ve(t.body, e), l = Ne(t.dy, e);
+ return O.makeVList({
+ positionType: "shift",
+ positionData: -l,
+ children: [{
+ type: "elem",
+ elem: n
+ }]
+ }, e);
+ },
+ mathmlBuilder(t, e) {
+ const n = new Y.MathNode("mpadded", [Ie(t.body, e)]), l = t.dy.number + t.dy.unit;
+ return n.setAttribute("voffset", l), n;
+ }
+ }), ne({
+ type: "internal",
+ names: ["\\relax"],
+ props: {
+ numArgs: 0,
+ allowedInText: !0
+ },
+ handler(t) {
+ let {
+ parser: e
+ } = t;
+ return {
+ type: "internal",
+ mode: e.mode
+ };
+ }
+ }), ne({
+ type: "rule",
+ names: ["\\rule"],
+ props: {
+ numArgs: 2,
+ numOptionalArgs: 1,
+ argTypes: ["size", "size", "size"]
+ },
+ handler(t, e, n) {
+ let {
+ parser: l
+ } = t;
+ const c = n[0], m = pe(e[0], "size"), b = pe(e[1], "size");
+ return {
+ type: "rule",
+ mode: l.mode,
+ shift: c && pe(c, "size").value,
+ width: m.value,
+ height: b.value
+ };
+ },
+ htmlBuilder(t, e) {
+ const n = O.makeSpan(["mord", "rule"], [], e), l = Ne(t.width, e), c = Ne(t.height, e), m = t.shift ? Ne(t.shift, e) : 0;
+ return n.style.borderRightWidth = $(l), n.style.borderTopWidth = $(c), n.style.bottom = $(m), n.width = l, n.height = c + m, n.depth = -m, n.maxFontSize = c * 1.125 * e.sizeMultiplier, n;
+ },
+ mathmlBuilder(t, e) {
+ const n = Ne(t.width, e), l = Ne(t.height, e), c = t.shift ? Ne(t.shift, e) : 0, m = e.color && e.getColor() || "black", b = new Y.MathNode("mspace");
+ b.setAttribute("mathbackground", m), b.setAttribute("width", $(n)), b.setAttribute("height", $(l));
+ const _ = new Y.MathNode("mpadded", [b]);
+ return c >= 0 ? _.setAttribute("height", $(c)) : (_.setAttribute("height", $(c)), _.setAttribute("depth", $(-c))), _.setAttribute("voffset", $(c)), _;
+ }
+ });
+ function Vi(t, e, n) {
+ const l = Je(t, e, !1), c = e.sizeMultiplier / n.sizeMultiplier;
+ for (let m = 0; m < l.length; m++) {
+ const b = l[m].classes.indexOf("sizing");
+ b < 0 ? Array.prototype.push.apply(l[m].classes, e.sizingClasses(n)) : l[m].classes[b + 1] === "reset-size" + e.size && (l[m].classes[b + 1] = "reset-size" + n.size), l[m].height *= c, l[m].depth *= c;
+ }
+ return O.makeFragment(l);
+ }
+ const Wi = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"];
+ ne({
+ type: "sizing",
+ names: Wi,
+ props: {
+ numArgs: 0,
+ allowedInText: !0
+ },
+ handler: (t, e) => {
+ let {
+ breakOnTokenText: n,
+ funcName: l,
+ parser: c
+ } = t;
+ const m = c.parseExpression(!1, n);
+ return {
+ type: "sizing",
+ mode: c.mode,
+ // Figure out what size to use based on the list of functions above
+ size: Wi.indexOf(l) + 1,
+ body: m
+ };
+ },
+ htmlBuilder: (t, e) => {
+ const n = e.havingSize(t.size);
+ return Vi(t.body, n, e);
+ },
+ mathmlBuilder: (t, e) => {
+ const n = e.havingSize(t.size), l = dt(t.body, n), c = new Y.MathNode("mstyle", l);
+ return c.setAttribute("mathsize", $(n.sizeMultiplier)), c;
+ }
+ }), ne({
+ type: "smash",
+ names: ["\\smash"],
+ props: {
+ numArgs: 1,
+ numOptionalArgs: 1,
+ allowedInText: !0
+ },
+ handler: (t, e, n) => {
+ let {
+ parser: l
+ } = t, c = !1, m = !1;
+ const b = n[0] && pe(n[0], "ordgroup");
+ if (b) {
+ let x = "";
+ for (let F = 0; F < b.body.length; ++F)
+ if (x = b.body[F].text, x === "t")
+ c = !0;
+ else if (x === "b")
+ m = !0;
+ else {
+ c = !1, m = !1;
+ break;
+ }
+ } else
+ c = !0, m = !0;
+ const _ = e[0];
+ return {
+ type: "smash",
+ mode: l.mode,
+ body: _,
+ smashHeight: c,
+ smashDepth: m
+ };
+ },
+ htmlBuilder: (t, e) => {
+ const n = O.makeSpan([], [ve(t.body, e)]);
+ if (!t.smashHeight && !t.smashDepth)
+ return n;
+ if (t.smashHeight && (n.height = 0, n.children))
+ for (let c = 0; c < n.children.length; c++)
+ n.children[c].height = 0;
+ if (t.smashDepth && (n.depth = 0, n.children))
+ for (let c = 0; c < n.children.length; c++)
+ n.children[c].depth = 0;
+ const l = O.makeVList({
+ positionType: "firstBaseline",
+ children: [{
+ type: "elem",
+ elem: n
+ }]
+ }, e);
+ return O.makeSpan(["mord"], [l], e);
+ },
+ mathmlBuilder: (t, e) => {
+ const n = new Y.MathNode("mpadded", [Ie(t.body, e)]);
+ return t.smashHeight && n.setAttribute("height", "0px"), t.smashDepth && n.setAttribute("depth", "0px"), n;
+ }
+ }), ne({
+ type: "sqrt",
+ names: ["\\sqrt"],
+ props: {
+ numArgs: 1,
+ numOptionalArgs: 1
+ },
+ handler(t, e, n) {
+ let {
+ parser: l
+ } = t;
+ const c = n[0], m = e[0];
+ return {
+ type: "sqrt",
+ mode: l.mode,
+ body: m,
+ index: c
+ };
+ },
+ htmlBuilder(t, e) {
+ let n = ve(t.body, e.havingCrampedStyle());
+ n.height === 0 && (n.height = e.fontMetrics().xHeight), n = O.wrapFragment(n, e);
+ const c = e.fontMetrics().defaultRuleThickness;
+ let m = c;
+ e.style.id < ae.TEXT.id && (m = e.fontMetrics().xHeight);
+ let b = c + m / 4;
+ const _ = n.height + n.depth + b + c, {
+ span: x,
+ ruleWidth: F,
+ advanceWidth: B
+ } = d0.sqrtImage(_, e), I = x.height - F;
+ I > n.height + n.depth + b && (b = (b + I - n.height - n.depth) / 2);
+ const q = x.height - n.height - b - F;
+ n.style.paddingLeft = $(B);
+ const W = O.makeVList({
+ positionType: "firstBaseline",
+ children: [{
+ type: "elem",
+ elem: n,
+ wrapperClasses: ["svg-align"]
+ }, {
+ type: "kern",
+ size: -(n.height + q)
+ }, {
+ type: "elem",
+ elem: x
+ }, {
+ type: "kern",
+ size: F
+ }]
+ }, e);
+ if (t.index) {
+ const se = e.havingStyle(ae.SCRIPTSCRIPT), ue = ve(t.index, se, e), xe = 0.6 * (W.height - W.depth), we = O.makeVList({
+ positionType: "shift",
+ positionData: -xe,
+ children: [{
+ type: "elem",
+ elem: ue
+ }]
+ }, e), De = O.makeSpan(["root"], [we]);
+ return O.makeSpan(["mord", "sqrt"], [De, W], e);
+ } else
+ return O.makeSpan(["mord", "sqrt"], [W], e);
+ },
+ mathmlBuilder(t, e) {
+ const {
+ body: n,
+ index: l
+ } = t;
+ return l ? new Y.MathNode("mroot", [Ie(n, e), Ie(l, e)]) : new Y.MathNode("msqrt", [Ie(n, e)]);
+ }
+ });
+ const ji = {
+ display: ae.DISPLAY,
+ text: ae.TEXT,
+ script: ae.SCRIPT,
+ scriptscript: ae.SCRIPTSCRIPT
+ };
+ ne({
+ type: "styling",
+ names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"],
+ props: {
+ numArgs: 0,
+ allowedInText: !0,
+ primitive: !0
+ },
+ handler(t, e) {
+ let {
+ breakOnTokenText: n,
+ funcName: l,
+ parser: c
+ } = t;
+ const m = c.parseExpression(!0, n), b = l.slice(1, l.length - 5);
+ return {
+ type: "styling",
+ mode: c.mode,
+ // Figure out what style to use by pulling out the style from
+ // the function name
+ style: b,
+ body: m
+ };
+ },
+ htmlBuilder(t, e) {
+ const n = ji[t.style], l = e.havingStyle(n).withFont("");
+ return Vi(t.body, l, e);
+ },
+ mathmlBuilder(t, e) {
+ const n = ji[t.style], l = e.havingStyle(n), c = dt(t.body, l), m = new Y.MathNode("mstyle", c), _ = {
+ display: ["0", "true"],
+ text: ["0", "false"],
+ script: ["1", "false"],
+ scriptscript: ["2", "false"]
+ }[t.style];
+ return m.setAttribute("scriptlevel", _[0]), m.setAttribute("displaystyle", _[1]), m;
+ }
+ });
+ const qu = function(t, e) {
+ const n = t.base;
+ return n ? n.type === "op" ? n.limits && (e.style.size === ae.DISPLAY.size || n.alwaysHandleSupSub) ? nn : null : n.type === "operatorname" ? n.alwaysHandleSupSub && (e.style.size === ae.DISPLAY.size || n.limits) ? Gi : null : n.type === "accent" ? R.isCharacterBox(n.base) ? Pr : null : n.type === "horizBrace" && !t.sub === n.isOver ? qi : null : null;
+ };
+ P0({
+ type: "supsub",
+ htmlBuilder(t, e) {
+ const n = qu(t, e);
+ if (n)
+ return n(t, e);
+ const {
+ base: l,
+ sup: c,
+ sub: m
+ } = t, b = ve(l, e);
+ let _, x;
+ const F = e.fontMetrics();
+ let B = 0, I = 0;
+ const q = l && R.isCharacterBox(l);
+ if (c) {
+ const Fe = e.havingStyle(e.style.sup());
+ _ = ve(c, Fe, e), q || (B = b.height - Fe.fontMetrics().supDrop * Fe.sizeMultiplier / e.sizeMultiplier);
+ }
+ if (m) {
+ const Fe = e.havingStyle(e.style.sub());
+ x = ve(m, Fe, e), q || (I = b.depth + Fe.fontMetrics().subDrop * Fe.sizeMultiplier / e.sizeMultiplier);
+ }
+ let W;
+ e.style === ae.DISPLAY ? W = F.sup1 : e.style.cramped ? W = F.sup3 : W = F.sup2;
+ const se = e.sizeMultiplier, ue = $(0.5 / F.ptPerEm / se);
+ let xe = null;
+ if (x) {
+ const Fe = t.base && t.base.type === "op" && t.base.name && (t.base.name === "\\oiint" || t.base.name === "\\oiiint");
+ (b instanceof st || Fe) && (xe = $(-b.italic));
+ }
+ let we;
+ if (_ && x) {
+ B = Math.max(B, W, _.depth + 0.25 * F.xHeight), I = Math.max(I, F.sub2);
+ const qe = 4 * F.defaultRuleThickness;
+ if (B - _.depth - (x.height - I) < qe) {
+ I = qe - (B - _.depth) + x.height;
+ const $e = 0.8 * F.xHeight - (B - _.depth);
+ $e > 0 && (B += $e, I -= $e);
+ }
+ const lt = [{
+ type: "elem",
+ elem: x,
+ shift: I,
+ marginRight: ue,
+ marginLeft: xe
+ }, {
+ type: "elem",
+ elem: _,
+ shift: -B,
+ marginRight: ue
+ }];
+ we = O.makeVList({
+ positionType: "individualShift",
+ children: lt
+ }, e);
+ } else if (x) {
+ I = Math.max(I, F.sub1, x.height - 0.8 * F.xHeight);
+ const Fe = [{
+ type: "elem",
+ elem: x,
+ marginLeft: xe,
+ marginRight: ue
+ }];
+ we = O.makeVList({
+ positionType: "shift",
+ positionData: I,
+ children: Fe
+ }, e);
+ } else if (_)
+ B = Math.max(B, W, _.depth + 0.25 * F.xHeight), we = O.makeVList({
+ positionType: "shift",
+ positionData: -B,
+ children: [{
+ type: "elem",
+ elem: _,
+ marginRight: ue
+ }]
+ }, e);
+ else
+ throw new Error("supsub must have either sup or sub.");
+ const De = Rr(b, "right") || "mord";
+ return O.makeSpan([De], [b, O.makeSpan(["msupsub"], [we])], e);
+ },
+ mathmlBuilder(t, e) {
+ let n = !1, l, c;
+ t.base && t.base.type === "horizBrace" && (c = !!t.sup, c === t.base.isOver && (n = !0, l = t.base.isOver)), t.base && (t.base.type === "op" || t.base.type === "operatorname") && (t.base.parentIsSupSub = !0);
+ const m = [Ie(t.base, e)];
+ t.sub && m.push(Ie(t.sub, e)), t.sup && m.push(Ie(t.sup, e));
+ let b;
+ if (n)
+ b = l ? "mover" : "munder";
+ else if (t.sub)
+ if (t.sup) {
+ const _ = t.base;
+ _ && _.type === "op" && _.limits && e.style === ae.DISPLAY || _ && _.type === "operatorname" && _.alwaysHandleSupSub && (e.style === ae.DISPLAY || _.limits) ? b = "munderover" : b = "msubsup";
+ } else {
+ const _ = t.base;
+ _ && _.type === "op" && _.limits && (e.style === ae.DISPLAY || _.alwaysHandleSupSub) || _ && _.type === "operatorname" && _.alwaysHandleSupSub && (_.limits || e.style === ae.DISPLAY) ? b = "munder" : b = "msub";
+ }
+ else {
+ const _ = t.base;
+ _ && _.type === "op" && _.limits && (e.style === ae.DISPLAY || _.alwaysHandleSupSub) || _ && _.type === "operatorname" && _.alwaysHandleSupSub && (_.limits || e.style === ae.DISPLAY) ? b = "mover" : b = "msup";
+ }
+ return new Y.MathNode(b, m);
+ }
+ }), P0({
+ type: "atom",
+ htmlBuilder(t, e) {
+ return O.mathsym(t.text, t.mode, e, ["m" + t.family]);
+ },
+ mathmlBuilder(t, e) {
+ const n = new Y.MathNode("mo", [Et(t.text, t.mode)]);
+ if (t.family === "bin") {
+ const l = Or(t, e);
+ l === "bold-italic" && n.setAttribute("mathvariant", l);
+ } else
+ t.family === "punct" ? n.setAttribute("separator", "true") : (t.family === "open" || t.family === "close") && n.setAttribute("stretchy", "false");
+ return n;
+ }
+ });
+ const Xi = {
+ mi: "italic",
+ mn: "normal",
+ mtext: "normal"
+ };
+ P0({
+ type: "mathord",
+ htmlBuilder(t, e) {
+ return O.makeOrd(t, e, "mathord");
+ },
+ mathmlBuilder(t, e) {
+ const n = new Y.MathNode("mi", [Et(t.text, t.mode, e)]), l = Or(t, e) || "italic";
+ return l !== Xi[n.type] && n.setAttribute("mathvariant", l), n;
+ }
+ }), P0({
+ type: "textord",
+ htmlBuilder(t, e) {
+ return O.makeOrd(t, e, "textord");
+ },
+ mathmlBuilder(t, e) {
+ const n = Et(t.text, t.mode, e), l = Or(t, e) || "normal";
+ let c;
+ return t.mode === "text" ? c = new Y.MathNode("mtext", [n]) : /[0-9]/.test(t.text) ? c = new Y.MathNode("mn", [n]) : t.text === "\\prime" ? c = new Y.MathNode("mo", [n]) : c = new Y.MathNode("mi", [n]), l !== Xi[c.type] && c.setAttribute("mathvariant", l), c;
+ }
+ });
+ const ns = {
+ "\\nobreak": "nobreak",
+ "\\allowbreak": "allowbreak"
+ }, rs = {
+ " ": {},
+ "\\ ": {},
+ "~": {
+ className: "nobreak"
+ },
+ "\\space": {},
+ "\\nobreakspace": {
+ className: "nobreak"
+ }
+ };
+ P0({
+ type: "spacing",
+ htmlBuilder(t, e) {
+ if (rs.hasOwnProperty(t.text)) {
+ const n = rs[t.text].className || "";
+ if (t.mode === "text") {
+ const l = O.makeOrd(t, e, "textord");
+ return l.classes.push(n), l;
+ } else
+ return O.makeSpan(["mspace", n], [O.mathsym(t.text, t.mode, e)], e);
+ } else {
+ if (ns.hasOwnProperty(t.text))
+ return O.makeSpan(["mspace", ns[t.text]], [], e);
+ throw new u('Unknown type of space "' + t.text + '"');
+ }
+ },
+ mathmlBuilder(t, e) {
+ let n;
+ if (rs.hasOwnProperty(t.text))
+ n = new Y.MathNode("mtext", [new Y.TextNode(" ")]);
+ else {
+ if (ns.hasOwnProperty(t.text))
+ return new Y.MathNode("mspace");
+ throw new u('Unknown type of space "' + t.text + '"');
+ }
+ return n;
+ }
+ });
+ const Yi = () => {
+ const t = new Y.MathNode("mtd", []);
+ return t.setAttribute("width", "50%"), t;
+ };
+ P0({
+ type: "tag",
+ mathmlBuilder(t, e) {
+ const n = new Y.MathNode("mtable", [new Y.MathNode("mtr", [Yi(), new Y.MathNode("mtd", [v0(t.body, e)]), Yi(), new Y.MathNode("mtd", [v0(t.tag, e)])])]);
+ return n.setAttribute("width", "100%"), n;
+ }
+ });
+ const Zi = {
+ "\\text": void 0,
+ "\\textrm": "textrm",
+ "\\textsf": "textsf",
+ "\\texttt": "texttt",
+ "\\textnormal": "textrm"
+ }, Ki = {
+ "\\textbf": "textbf",
+ "\\textmd": "textmd"
+ }, Pu = {
+ "\\textit": "textit",
+ "\\textup": "textup"
+ }, Qi = (t, e) => {
+ const n = t.font;
+ return n ? Zi[n] ? e.withTextFontFamily(Zi[n]) : Ki[n] ? e.withTextFontWeight(Ki[n]) : e.withTextFontShape(Pu[n]) : e;
+ };
+ ne({
+ type: "text",
+ names: [
+ // Font families
+ "\\text",
+ "\\textrm",
+ "\\textsf",
+ "\\texttt",
+ "\\textnormal",
+ // Font weights
+ "\\textbf",
+ "\\textmd",
+ // Font Shapes
+ "\\textit",
+ "\\textup"
+ ],
+ props: {
+ numArgs: 1,
+ argTypes: ["text"],
+ allowedInArgument: !0,
+ allowedInText: !0
+ },
+ handler(t, e) {
+ let {
+ parser: n,
+ funcName: l
+ } = t;
+ const c = e[0];
+ return {
+ type: "text",
+ mode: n.mode,
+ body: Ze(c),
+ font: l
+ };
+ },
+ htmlBuilder(t, e) {
+ const n = Qi(t, e), l = Je(t.body, n, !0);
+ return O.makeSpan(["mord", "text"], l, n);
+ },
+ mathmlBuilder(t, e) {
+ const n = Qi(t, e);
+ return v0(t.body, n);
+ }
+ }), ne({
+ type: "underline",
+ names: ["\\underline"],
+ props: {
+ numArgs: 1,
+ allowedInText: !0
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ return {
+ type: "underline",
+ mode: n.mode,
+ body: e[0]
+ };
+ },
+ htmlBuilder(t, e) {
+ const n = ve(t.body, e), l = O.makeLineSpan("underline-line", e), c = e.fontMetrics().defaultRuleThickness, m = O.makeVList({
+ positionType: "top",
+ positionData: n.height,
+ children: [{
+ type: "kern",
+ size: c
+ }, {
+ type: "elem",
+ elem: l
+ }, {
+ type: "kern",
+ size: 3 * c
+ }, {
+ type: "elem",
+ elem: n
+ }]
+ }, e);
+ return O.makeSpan(["mord", "underline"], [m], e);
+ },
+ mathmlBuilder(t, e) {
+ const n = new Y.MathNode("mo", [new Y.TextNode("‾")]);
+ n.setAttribute("stretchy", "true");
+ const l = new Y.MathNode("munder", [Ie(t.body, e), n]);
+ return l.setAttribute("accentunder", "true"), l;
+ }
+ }), ne({
+ type: "vcenter",
+ names: ["\\vcenter"],
+ props: {
+ numArgs: 1,
+ argTypes: ["original"],
+ // In LaTeX, \vcenter can act only on a box.
+ allowedInText: !1
+ },
+ handler(t, e) {
+ let {
+ parser: n
+ } = t;
+ return {
+ type: "vcenter",
+ mode: n.mode,
+ body: e[0]
+ };
+ },
+ htmlBuilder(t, e) {
+ const n = ve(t.body, e), l = e.fontMetrics().axisHeight, c = 0.5 * (n.height - l - (n.depth + l));
+ return O.makeVList({
+ positionType: "shift",
+ positionData: c,
+ children: [{
+ type: "elem",
+ elem: n
+ }]
+ }, e);
+ },
+ mathmlBuilder(t, e) {
+ return new Y.MathNode("mpadded", [Ie(t.body, e)], ["vcenter"]);
+ }
+ }), ne({
+ type: "verb",
+ names: ["\\verb"],
+ props: {
+ numArgs: 0,
+ allowedInText: !0
+ },
+ handler(t, e, n) {
+ throw new u("\\verb ended by end of line instead of matching delimiter");
+ },
+ htmlBuilder(t, e) {
+ const n = Ji(t), l = [], c = e.havingStyle(e.style.text());
+ for (let m = 0; m < n.length; m++) {
+ let b = n[m];
+ b === "~" && (b = "\\textasciitilde"), l.push(O.makeSymbol(b, "Typewriter-Regular", t.mode, c, ["mord", "texttt"]));
+ }
+ return O.makeSpan(["mord", "text"].concat(c.sizingClasses(e)), O.tryCombineChars(l), c);
+ },
+ mathmlBuilder(t, e) {
+ const n = new Y.TextNode(Ji(t)), l = new Y.MathNode("mtext", [n]);
+ return l.setAttribute("mathvariant", "monospace"), l;
+ }
+ });
+ const Ji = (t) => t.body.replace(/ /g, t.star ? "␣" : " ");
+ var S0 = ri;
+ const $i = `[ \r
+ ]`, Hu = "\\\\[a-zA-Z@]+", Uu = "\\\\[^\uD800-\uDFFF]", Gu = "(" + Hu + ")" + $i + "*", Vu = `\\\\(
+|[ \r ]+
+?)[ \r ]*`, ss = "[̀-ͯ]", Wu = new RegExp(ss + "+$"), ju = "(" + $i + "+)|" + // whitespace
+ (Vu + "|") + // \whitespace
+ "([!-\\[\\]-‧-豈-]" + // single codepoint
+ (ss + "*") + // ...plus accents
+ "|[\uD800-\uDBFF][\uDC00-\uDFFF]" + // surrogate pair
+ (ss + "*") + // ...plus accents
+ "|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5" + // \verb unstarred
+ ("|" + Gu) + // \macroName + spaces
+ ("|" + Uu + ")");
+ class el {
+ // Category codes. The lexer only supports comment characters (14) for now.
+ // MacroExpander additionally distinguishes active (13).
+ constructor(e, n) {
+ this.input = void 0, this.settings = void 0, this.tokenRegex = void 0, this.catcodes = void 0, this.input = e, this.settings = n, this.tokenRegex = new RegExp(ju, "g"), this.catcodes = {
+ "%": 14,
+ // comment character
+ "~": 13
+ // active character
+ };
+ }
+ setCatcode(e, n) {
+ this.catcodes[e] = n;
+ }
+ /**
+ * This function lexes a single token.
+ */
+ lex() {
+ const e = this.input, n = this.tokenRegex.lastIndex;
+ if (n === e.length)
+ return new Ct("EOF", new bt(this, n, n));
+ const l = this.tokenRegex.exec(e);
+ if (l === null || l.index !== n)
+ throw new u("Unexpected character: '" + e[n] + "'", new Ct(e[n], new bt(this, n, n + 1)));
+ const c = l[6] || l[3] || (l[2] ? "\\ " : " ");
+ if (this.catcodes[c] === 14) {
+ const m = e.indexOf(`
+`, this.tokenRegex.lastIndex);
+ return m === -1 ? (this.tokenRegex.lastIndex = e.length, this.settings.reportNonstrict("commentAtEnd", "% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")) : this.tokenRegex.lastIndex = m + 1, this.lex();
+ }
+ return new Ct(c, new bt(this, n, this.tokenRegex.lastIndex));
+ }
+ }
+ class Xu {
+ /**
+ * Both arguments are optional. The first argument is an object of
+ * built-in mappings which never change. The second argument is an object
+ * of initial (global-level) mappings, which will constantly change
+ * according to any global/top-level `set`s done.
+ */
+ constructor(e, n) {
+ e === void 0 && (e = {}), n === void 0 && (n = {}), this.current = void 0, this.builtins = void 0, this.undefStack = void 0, this.current = n, this.builtins = e, this.undefStack = [];
+ }
+ /**
+ * Start a new nested group, affecting future local `set`s.
+ */
+ beginGroup() {
+ this.undefStack.push({});
+ }
+ /**
+ * End current nested group, restoring values before the group began.
+ */
+ endGroup() {
+ if (this.undefStack.length === 0)
+ throw new u("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");
+ const e = this.undefStack.pop();
+ for (const n in e)
+ e.hasOwnProperty(n) && (e[n] == null ? delete this.current[n] : this.current[n] = e[n]);
+ }
+ /**
+ * Ends all currently nested groups (if any), restoring values before the
+ * groups began. Useful in case of an error in the middle of parsing.
+ */
+ endGroups() {
+ for (; this.undefStack.length > 0; )
+ this.endGroup();
+ }
+ /**
+ * Detect whether `name` has a definition. Equivalent to
+ * `get(name) != null`.
+ */
+ has(e) {
+ return this.current.hasOwnProperty(e) || this.builtins.hasOwnProperty(e);
+ }
+ /**
+ * Get the current value of a name, or `undefined` if there is no value.
+ *
+ * Note: Do not use `if (namespace.get(...))` to detect whether a macro
+ * is defined, as the definition may be the empty string which evaluates
+ * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or
+ * `if (namespace.has(...))`.
+ */
+ get(e) {
+ return this.current.hasOwnProperty(e) ? this.current[e] : this.builtins[e];
+ }
+ /**
+ * Set the current value of a name, and optionally set it globally too.
+ * Local set() sets the current value and (when appropriate) adds an undo
+ * operation to the undo stack. Global set() may change the undo
+ * operation at every level, so takes time linear in their number.
+ * A value of undefined means to delete existing definitions.
+ */
+ set(e, n, l) {
+ if (l === void 0 && (l = !1), l) {
+ for (let c = 0; c < this.undefStack.length; c++)
+ delete this.undefStack[c][e];
+ this.undefStack.length > 0 && (this.undefStack[this.undefStack.length - 1][e] = n);
+ } else {
+ const c = this.undefStack[this.undefStack.length - 1];
+ c && !c.hasOwnProperty(e) && (c[e] = this.current[e]);
+ }
+ n == null ? delete this.current[e] : this.current[e] = n;
+ }
+ }
+ var Yu = Ci;
+ k("\\noexpand", function(t) {
+ const e = t.popToken();
+ return t.isExpandable(e.text) && (e.noexpand = !0, e.treatAsRelax = !0), {
+ tokens: [e],
+ numArgs: 0
+ };
+ }), k("\\expandafter", function(t) {
+ const e = t.popToken();
+ return t.expandOnce(!0), {
+ tokens: [e],
+ numArgs: 0
+ };
+ }), k("\\@firstoftwo", function(t) {
+ return {
+ tokens: t.consumeArgs(2)[0],
+ numArgs: 0
+ };
+ }), k("\\@secondoftwo", function(t) {
+ return {
+ tokens: t.consumeArgs(2)[1],
+ numArgs: 0
+ };
+ }), k("\\@ifnextchar", function(t) {
+ const e = t.consumeArgs(3);
+ t.consumeSpaces();
+ const n = t.future();
+ return e[0].length === 1 && e[0][0].text === n.text ? {
+ tokens: e[1],
+ numArgs: 0
+ } : {
+ tokens: e[2],
+ numArgs: 0
+ };
+ }), k("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"), k("\\TextOrMath", function(t) {
+ const e = t.consumeArgs(2);
+ return t.mode === "text" ? {
+ tokens: e[0],
+ numArgs: 0
+ } : {
+ tokens: e[1],
+ numArgs: 0
+ };
+ });
+ const tl = {
+ 0: 0,
+ 1: 1,
+ 2: 2,
+ 3: 3,
+ 4: 4,
+ 5: 5,
+ 6: 6,
+ 7: 7,
+ 8: 8,
+ 9: 9,
+ a: 10,
+ A: 10,
+ b: 11,
+ B: 11,
+ c: 12,
+ C: 12,
+ d: 13,
+ D: 13,
+ e: 14,
+ E: 14,
+ f: 15,
+ F: 15
+ };
+ k("\\char", function(t) {
+ let e = t.popToken(), n, l = "";
+ if (e.text === "'")
+ n = 8, e = t.popToken();
+ else if (e.text === '"')
+ n = 16, e = t.popToken();
+ else if (e.text === "`")
+ if (e = t.popToken(), e.text[0] === "\\")
+ l = e.text.charCodeAt(1);
+ else {
+ if (e.text === "EOF")
+ throw new u("\\char` missing argument");
+ l = e.text.charCodeAt(0);
+ }
+ else
+ n = 10;
+ if (n) {
+ if (l = tl[e.text], l == null || l >= n)
+ throw new u("Invalid base-" + n + " digit " + e.text);
+ let c;
+ for (; (c = tl[t.future().text]) != null && c < n; )
+ l *= n, l += c, t.popToken();
+ }
+ return "\\@char{" + l + "}";
+ });
+ const is = (t, e, n) => {
+ let l = t.consumeArg().tokens;
+ if (l.length !== 1)
+ throw new u("\\newcommand's first argument must be a macro name");
+ const c = l[0].text, m = t.isDefined(c);
+ if (m && !e)
+ throw new u("\\newcommand{" + c + "} attempting to redefine " + (c + "; use \\renewcommand"));
+ if (!m && !n)
+ throw new u("\\renewcommand{" + c + "} when command " + c + " does not yet exist; use \\newcommand");
+ let b = 0;
+ if (l = t.consumeArg().tokens, l.length === 1 && l[0].text === "[") {
+ let _ = "", x = t.expandNextToken();
+ for (; x.text !== "]" && x.text !== "EOF"; )
+ _ += x.text, x = t.expandNextToken();
+ if (!_.match(/^\s*[0-9]+\s*$/))
+ throw new u("Invalid number of arguments: " + _);
+ b = parseInt(_), l = t.consumeArg().tokens;
+ }
+ return t.macros.set(c, {
+ tokens: l,
+ numArgs: b
+ }), "";
+ };
+ k("\\newcommand", (t) => is(t, !1, !0)), k("\\renewcommand", (t) => is(t, !0, !1)), k("\\providecommand", (t) => is(t, !0, !0)), k("\\message", (t) => {
+ const e = t.consumeArgs(1)[0];
+ return console.log(e.reverse().map((n) => n.text).join("")), "";
+ }), k("\\errmessage", (t) => {
+ const e = t.consumeArgs(1)[0];
+ return console.error(e.reverse().map((n) => n.text).join("")), "";
+ }), k("\\show", (t) => {
+ const e = t.popToken(), n = e.text;
+ return console.log(e, t.macros.get(n), S0[n], Le.math[n], Le.text[n]), "";
+ }), k("\\bgroup", "{"), k("\\egroup", "}"), k("~", "\\nobreakspace"), k("\\lq", "`"), k("\\rq", "'"), k("\\aa", "\\r a"), k("\\AA", "\\r A"), k("\\textcopyright", "\\html@mathml{\\textcircled{c}}{\\char`©}"), k("\\copyright", "\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"), k("\\textregistered", "\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"), k("ℬ", "\\mathscr{B}"), k("ℰ", "\\mathscr{E}"), k("ℱ", "\\mathscr{F}"), k("ℋ", "\\mathscr{H}"), k("ℐ", "\\mathscr{I}"), k("ℒ", "\\mathscr{L}"), k("ℳ", "\\mathscr{M}"), k("ℛ", "\\mathscr{R}"), k("ℭ", "\\mathfrak{C}"), k("ℌ", "\\mathfrak{H}"), k("ℨ", "\\mathfrak{Z}"), k("\\Bbbk", "\\Bbb{k}"), k("·", "\\cdotp"), k("\\llap", "\\mathllap{\\textrm{#1}}"), k("\\rlap", "\\mathrlap{\\textrm{#1}}"), k("\\clap", "\\mathclap{\\textrm{#1}}"), k("\\mathstrut", "\\vphantom{(}"), k("\\underbar", "\\underline{\\text{#1}}"), k("\\not", '\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'), k("\\neq", "\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}"), k("\\ne", "\\neq"), k("≠", "\\neq"), k("\\notin", "\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`∉}}"), k("∉", "\\notin"), k("≘", "\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`≘}}"), k("≙", "\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`≘}}"), k("≚", "\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`≚}}"), k("≛", "\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`≛}}"), k("≝", "\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`≝}}"), k("≞", "\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`≞}}"), k("≟", "\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`≟}}"), k("⟂", "\\perp"), k("‼", "\\mathclose{!\\mkern-0.8mu!}"), k("∌", "\\notni"), k("⌜", "\\ulcorner"), k("⌝", "\\urcorner"), k("⌞", "\\llcorner"), k("⌟", "\\lrcorner"), k("©", "\\copyright"), k("®", "\\textregistered"), k("️", "\\textregistered"), k("\\ulcorner", '\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}'), k("\\urcorner", '\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}'), k("\\llcorner", '\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}'), k("\\lrcorner", '\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}'), k("\\vdots", "\\mathord{\\varvdots\\rule{0pt}{15pt}}"), k("⋮", "\\vdots"), k("\\varGamma", "\\mathit{\\Gamma}"), k("\\varDelta", "\\mathit{\\Delta}"), k("\\varTheta", "\\mathit{\\Theta}"), k("\\varLambda", "\\mathit{\\Lambda}"), k("\\varXi", "\\mathit{\\Xi}"), k("\\varPi", "\\mathit{\\Pi}"), k("\\varSigma", "\\mathit{\\Sigma}"), k("\\varUpsilon", "\\mathit{\\Upsilon}"), k("\\varPhi", "\\mathit{\\Phi}"), k("\\varPsi", "\\mathit{\\Psi}"), k("\\varOmega", "\\mathit{\\Omega}"), k("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"), k("\\colon", "\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax"), k("\\boxed", "\\fbox{$\\displaystyle{#1}$}"), k("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"), k("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"), k("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;");
+ const nl = {
+ ",": "\\dotsc",
+ "\\not": "\\dotsb",
+ // \keybin@ checks for the following:
+ "+": "\\dotsb",
+ "=": "\\dotsb",
+ "<": "\\dotsb",
+ ">": "\\dotsb",
+ "-": "\\dotsb",
+ "*": "\\dotsb",
+ ":": "\\dotsb",
+ // Symbols whose definition starts with \DOTSB:
+ "\\DOTSB": "\\dotsb",
+ "\\coprod": "\\dotsb",
+ "\\bigvee": "\\dotsb",
+ "\\bigwedge": "\\dotsb",
+ "\\biguplus": "\\dotsb",
+ "\\bigcap": "\\dotsb",
+ "\\bigcup": "\\dotsb",
+ "\\prod": "\\dotsb",
+ "\\sum": "\\dotsb",
+ "\\bigotimes": "\\dotsb",
+ "\\bigoplus": "\\dotsb",
+ "\\bigodot": "\\dotsb",
+ "\\bigsqcup": "\\dotsb",
+ "\\And": "\\dotsb",
+ "\\longrightarrow": "\\dotsb",
+ "\\Longrightarrow": "\\dotsb",
+ "\\longleftarrow": "\\dotsb",
+ "\\Longleftarrow": "\\dotsb",
+ "\\longleftrightarrow": "\\dotsb",
+ "\\Longleftrightarrow": "\\dotsb",
+ "\\mapsto": "\\dotsb",
+ "\\longmapsto": "\\dotsb",
+ "\\hookrightarrow": "\\dotsb",
+ "\\doteq": "\\dotsb",
+ // Symbols whose definition starts with \mathbin:
+ "\\mathbin": "\\dotsb",
+ // Symbols whose definition starts with \mathrel:
+ "\\mathrel": "\\dotsb",
+ "\\relbar": "\\dotsb",
+ "\\Relbar": "\\dotsb",
+ "\\xrightarrow": "\\dotsb",
+ "\\xleftarrow": "\\dotsb",
+ // Symbols whose definition starts with \DOTSI:
+ "\\DOTSI": "\\dotsi",
+ "\\int": "\\dotsi",
+ "\\oint": "\\dotsi",
+ "\\iint": "\\dotsi",
+ "\\iiint": "\\dotsi",
+ "\\iiiint": "\\dotsi",
+ "\\idotsint": "\\dotsi",
+ // Symbols whose definition starts with \DOTSX:
+ "\\DOTSX": "\\dotsx"
+ };
+ k("\\dots", function(t) {
+ let e = "\\dotso";
+ const n = t.expandAfterFuture().text;
+ return n in nl ? e = nl[n] : (n.slice(0, 4) === "\\not" || n in Le.math && R.contains(["bin", "rel"], Le.math[n].group)) && (e = "\\dotsb"), e;
+ });
+ const ls = {
+ // \rightdelim@ checks for the following:
+ ")": !0,
+ "]": !0,
+ "\\rbrack": !0,
+ "\\}": !0,
+ "\\rbrace": !0,
+ "\\rangle": !0,
+ "\\rceil": !0,
+ "\\rfloor": !0,
+ "\\rgroup": !0,
+ "\\rmoustache": !0,
+ "\\right": !0,
+ "\\bigr": !0,
+ "\\biggr": !0,
+ "\\Bigr": !0,
+ "\\Biggr": !0,
+ // \extra@ also tests for the following:
+ $: !0,
+ // \extrap@ checks for the following:
+ ";": !0,
+ ".": !0,
+ ",": !0
+ };
+ k("\\dotso", function(t) {
+ return t.future().text in ls ? "\\ldots\\," : "\\ldots";
+ }), k("\\dotsc", function(t) {
+ const e = t.future().text;
+ return e in ls && e !== "," ? "\\ldots\\," : "\\ldots";
+ }), k("\\cdots", function(t) {
+ return t.future().text in ls ? "\\@cdots\\," : "\\@cdots";
+ }), k("\\dotsb", "\\cdots"), k("\\dotsm", "\\cdots"), k("\\dotsi", "\\!\\cdots"), k("\\dotsx", "\\ldots\\,"), k("\\DOTSI", "\\relax"), k("\\DOTSB", "\\relax"), k("\\DOTSX", "\\relax"), k("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"), k("\\,", "\\tmspace+{3mu}{.1667em}"), k("\\thinspace", "\\,"), k("\\>", "\\mskip{4mu}"), k("\\:", "\\tmspace+{4mu}{.2222em}"), k("\\medspace", "\\:"), k("\\;", "\\tmspace+{5mu}{.2777em}"), k("\\thickspace", "\\;"), k("\\!", "\\tmspace-{3mu}{.1667em}"), k("\\negthinspace", "\\!"), k("\\negmedspace", "\\tmspace-{4mu}{.2222em}"), k("\\negthickspace", "\\tmspace-{5mu}{.277em}"), k("\\enspace", "\\kern.5em "), k("\\enskip", "\\hskip.5em\\relax"), k("\\quad", "\\hskip1em\\relax"), k("\\qquad", "\\hskip2em\\relax"), k("\\tag", "\\@ifstar\\tag@literal\\tag@paren"), k("\\tag@paren", "\\tag@literal{({#1})}"), k("\\tag@literal", (t) => {
+ if (t.macros.get("\\df@tag"))
+ throw new u("Multiple \\tag");
+ return "\\gdef\\df@tag{\\text{#1}}";
+ }), k("\\bmod", "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"), k("\\pod", "\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"), k("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"), k("\\mod", "\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"), k("\\newline", "\\\\\\relax"), k("\\TeX", "\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");
+ const rl = $(gt["Main-Regular"][84][1] - 0.7 * gt["Main-Regular"][65][1]);
+ k("\\LaTeX", "\\textrm{\\html@mathml{" + ("L\\kern-.36em\\raisebox{" + rl + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{LaTeX}}"), k("\\KaTeX", "\\textrm{\\html@mathml{" + ("K\\kern-.17em\\raisebox{" + rl + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{KaTeX}}"), k("\\hspace", "\\@ifstar\\@hspacer\\@hspace"), k("\\@hspace", "\\hskip #1\\relax"), k("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"), k("\\ordinarycolon", ":"), k("\\vcentcolon", "\\mathrel{\\mathop\\ordinarycolon}"), k("\\dblcolon", '\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'), k("\\coloneqq", '\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'), k("\\Coloneqq", '\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'), k("\\coloneq", '\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'), k("\\Coloneq", '\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'), k("\\eqqcolon", '\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'), k("\\Eqqcolon", '\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'), k("\\eqcolon", '\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'), k("\\Eqcolon", '\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'), k("\\colonapprox", '\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'), k("\\Colonapprox", '\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'), k("\\colonsim", '\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'), k("\\Colonsim", '\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'), k("∷", "\\dblcolon"), k("∹", "\\eqcolon"), k("≔", "\\coloneqq"), k("≕", "\\eqqcolon"), k("⩴", "\\Coloneqq"), k("\\ratio", "\\vcentcolon"), k("\\coloncolon", "\\dblcolon"), k("\\colonequals", "\\coloneqq"), k("\\coloncolonequals", "\\Coloneqq"), k("\\equalscolon", "\\eqqcolon"), k("\\equalscoloncolon", "\\Eqqcolon"), k("\\colonminus", "\\coloneq"), k("\\coloncolonminus", "\\Coloneq"), k("\\minuscolon", "\\eqcolon"), k("\\minuscoloncolon", "\\Eqcolon"), k("\\coloncolonapprox", "\\Colonapprox"), k("\\coloncolonsim", "\\Colonsim"), k("\\simcolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"), k("\\simcoloncolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"), k("\\approxcolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"), k("\\approxcoloncolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"), k("\\notni", "\\html@mathml{\\not\\ni}{\\mathrel{\\char`∌}}"), k("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}"), k("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"), k("\\injlim", "\\DOTSB\\operatorname*{inj\\,lim}"), k("\\projlim", "\\DOTSB\\operatorname*{proj\\,lim}"), k("\\varlimsup", "\\DOTSB\\operatorname*{\\overline{lim}}"), k("\\varliminf", "\\DOTSB\\operatorname*{\\underline{lim}}"), k("\\varinjlim", "\\DOTSB\\operatorname*{\\underrightarrow{lim}}"), k("\\varprojlim", "\\DOTSB\\operatorname*{\\underleftarrow{lim}}"), k("\\gvertneqq", "\\html@mathml{\\@gvertneqq}{≩}"), k("\\lvertneqq", "\\html@mathml{\\@lvertneqq}{≨}"), k("\\ngeqq", "\\html@mathml{\\@ngeqq}{≱}"), k("\\ngeqslant", "\\html@mathml{\\@ngeqslant}{≱}"), k("\\nleqq", "\\html@mathml{\\@nleqq}{≰}"), k("\\nleqslant", "\\html@mathml{\\@nleqslant}{≰}"), k("\\nshortmid", "\\html@mathml{\\@nshortmid}{∤}"), k("\\nshortparallel", "\\html@mathml{\\@nshortparallel}{∦}"), k("\\nsubseteqq", "\\html@mathml{\\@nsubseteqq}{⊈}"), k("\\nsupseteqq", "\\html@mathml{\\@nsupseteqq}{⊉}"), k("\\varsubsetneq", "\\html@mathml{\\@varsubsetneq}{⊊}"), k("\\varsubsetneqq", "\\html@mathml{\\@varsubsetneqq}{⫋}"), k("\\varsupsetneq", "\\html@mathml{\\@varsupsetneq}{⊋}"), k("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{⫌}"), k("\\imath", "\\html@mathml{\\@imath}{ı}"), k("\\jmath", "\\html@mathml{\\@jmath}{ȷ}"), k("\\llbracket", "\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`⟦}}"), k("\\rrbracket", "\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`⟧}}"), k("⟦", "\\llbracket"), k("⟧", "\\rrbracket"), k("\\lBrace", "\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`⦃}}"), k("\\rBrace", "\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`⦄}}"), k("⦃", "\\lBrace"), k("⦄", "\\rBrace"), k("\\minuso", "\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`⦵}}"), k("⦵", "\\minuso"), k("\\darr", "\\downarrow"), k("\\dArr", "\\Downarrow"), k("\\Darr", "\\Downarrow"), k("\\lang", "\\langle"), k("\\rang", "\\rangle"), k("\\uarr", "\\uparrow"), k("\\uArr", "\\Uparrow"), k("\\Uarr", "\\Uparrow"), k("\\N", "\\mathbb{N}"), k("\\R", "\\mathbb{R}"), k("\\Z", "\\mathbb{Z}"), k("\\alef", "\\aleph"), k("\\alefsym", "\\aleph"), k("\\Alpha", "\\mathrm{A}"), k("\\Beta", "\\mathrm{B}"), k("\\bull", "\\bullet"), k("\\Chi", "\\mathrm{X}"), k("\\clubs", "\\clubsuit"), k("\\cnums", "\\mathbb{C}"), k("\\Complex", "\\mathbb{C}"), k("\\Dagger", "\\ddagger"), k("\\diamonds", "\\diamondsuit"), k("\\empty", "\\emptyset"), k("\\Epsilon", "\\mathrm{E}"), k("\\Eta", "\\mathrm{H}"), k("\\exist", "\\exists"), k("\\harr", "\\leftrightarrow"), k("\\hArr", "\\Leftrightarrow"), k("\\Harr", "\\Leftrightarrow"), k("\\hearts", "\\heartsuit"), k("\\image", "\\Im"), k("\\infin", "\\infty"), k("\\Iota", "\\mathrm{I}"), k("\\isin", "\\in"), k("\\Kappa", "\\mathrm{K}"), k("\\larr", "\\leftarrow"), k("\\lArr", "\\Leftarrow"), k("\\Larr", "\\Leftarrow"), k("\\lrarr", "\\leftrightarrow"), k("\\lrArr", "\\Leftrightarrow"), k("\\Lrarr", "\\Leftrightarrow"), k("\\Mu", "\\mathrm{M}"), k("\\natnums", "\\mathbb{N}"), k("\\Nu", "\\mathrm{N}"), k("\\Omicron", "\\mathrm{O}"), k("\\plusmn", "\\pm"), k("\\rarr", "\\rightarrow"), k("\\rArr", "\\Rightarrow"), k("\\Rarr", "\\Rightarrow"), k("\\real", "\\Re"), k("\\reals", "\\mathbb{R}"), k("\\Reals", "\\mathbb{R}"), k("\\Rho", "\\mathrm{P}"), k("\\sdot", "\\cdot"), k("\\sect", "\\S"), k("\\spades", "\\spadesuit"), k("\\sub", "\\subset"), k("\\sube", "\\subseteq"), k("\\supe", "\\supseteq"), k("\\Tau", "\\mathrm{T}"), k("\\thetasym", "\\vartheta"), k("\\weierp", "\\wp"), k("\\Zeta", "\\mathrm{Z}"), k("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}"), k("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}"), k("\\plim", "\\DOTSB\\mathop{\\operatorname{plim}}\\limits"), k("\\bra", "\\mathinner{\\langle{#1}|}"), k("\\ket", "\\mathinner{|{#1}\\rangle}"), k("\\braket", "\\mathinner{\\langle{#1}\\rangle}"), k("\\Bra", "\\left\\langle#1\\right|"), k("\\Ket", "\\left|#1\\right\\rangle");
+ const sl = (t) => (e) => {
+ const n = e.consumeArg().tokens, l = e.consumeArg().tokens, c = e.consumeArg().tokens, m = e.consumeArg().tokens, b = e.macros.get("|"), _ = e.macros.get("\\|");
+ e.macros.beginGroup();
+ const x = (I) => (q) => {
+ t && (q.macros.set("|", b), c.length && q.macros.set("\\|", _));
+ let W = I;
+ return !I && c.length && q.future().text === "|" && (q.popToken(), W = !0), {
+ tokens: W ? c : l,
+ numArgs: 0
+ };
+ };
+ e.macros.set("|", x(!1)), c.length && e.macros.set("\\|", x(!0));
+ const F = e.consumeArg().tokens, B = e.expandTokens([
+ ...m,
+ ...F,
+ ...n
+ // reversed
+ ]);
+ return e.macros.endGroup(), {
+ tokens: B.reverse(),
+ numArgs: 0
+ };
+ };
+ k("\\bra@ket", sl(!1)), k("\\bra@set", sl(!0)), k("\\Braket", "\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}"), k("\\Set", "\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}"), k("\\set", "\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"), k("\\angln", "{\\angl n}"), k("\\blue", "\\textcolor{##6495ed}{#1}"), k("\\orange", "\\textcolor{##ffa500}{#1}"), k("\\pink", "\\textcolor{##ff00af}{#1}"), k("\\red", "\\textcolor{##df0030}{#1}"), k("\\green", "\\textcolor{##28ae7b}{#1}"), k("\\gray", "\\textcolor{gray}{#1}"), k("\\purple", "\\textcolor{##9d38bd}{#1}"), k("\\blueA", "\\textcolor{##ccfaff}{#1}"), k("\\blueB", "\\textcolor{##80f6ff}{#1}"), k("\\blueC", "\\textcolor{##63d9ea}{#1}"), k("\\blueD", "\\textcolor{##11accd}{#1}"), k("\\blueE", "\\textcolor{##0c7f99}{#1}"), k("\\tealA", "\\textcolor{##94fff5}{#1}"), k("\\tealB", "\\textcolor{##26edd5}{#1}"), k("\\tealC", "\\textcolor{##01d1c1}{#1}"), k("\\tealD", "\\textcolor{##01a995}{#1}"), k("\\tealE", "\\textcolor{##208170}{#1}"), k("\\greenA", "\\textcolor{##b6ffb0}{#1}"), k("\\greenB", "\\textcolor{##8af281}{#1}"), k("\\greenC", "\\textcolor{##74cf70}{#1}"), k("\\greenD", "\\textcolor{##1fab54}{#1}"), k("\\greenE", "\\textcolor{##0d923f}{#1}"), k("\\goldA", "\\textcolor{##ffd0a9}{#1}"), k("\\goldB", "\\textcolor{##ffbb71}{#1}"), k("\\goldC", "\\textcolor{##ff9c39}{#1}"), k("\\goldD", "\\textcolor{##e07d10}{#1}"), k("\\goldE", "\\textcolor{##a75a05}{#1}"), k("\\redA", "\\textcolor{##fca9a9}{#1}"), k("\\redB", "\\textcolor{##ff8482}{#1}"), k("\\redC", "\\textcolor{##f9685d}{#1}"), k("\\redD", "\\textcolor{##e84d39}{#1}"), k("\\redE", "\\textcolor{##bc2612}{#1}"), k("\\maroonA", "\\textcolor{##ffbde0}{#1}"), k("\\maroonB", "\\textcolor{##ff92c6}{#1}"), k("\\maroonC", "\\textcolor{##ed5fa6}{#1}"), k("\\maroonD", "\\textcolor{##ca337c}{#1}"), k("\\maroonE", "\\textcolor{##9e034e}{#1}"), k("\\purpleA", "\\textcolor{##ddd7ff}{#1}"), k("\\purpleB", "\\textcolor{##c6b9fc}{#1}"), k("\\purpleC", "\\textcolor{##aa87ff}{#1}"), k("\\purpleD", "\\textcolor{##7854ab}{#1}"), k("\\purpleE", "\\textcolor{##543b78}{#1}"), k("\\mintA", "\\textcolor{##f5f9e8}{#1}"), k("\\mintB", "\\textcolor{##edf2df}{#1}"), k("\\mintC", "\\textcolor{##e0e5cc}{#1}"), k("\\grayA", "\\textcolor{##f6f7f7}{#1}"), k("\\grayB", "\\textcolor{##f0f1f2}{#1}"), k("\\grayC", "\\textcolor{##e3e5e6}{#1}"), k("\\grayD", "\\textcolor{##d6d8da}{#1}"), k("\\grayE", "\\textcolor{##babec2}{#1}"), k("\\grayF", "\\textcolor{##888d93}{#1}"), k("\\grayG", "\\textcolor{##626569}{#1}"), k("\\grayH", "\\textcolor{##3b3e40}{#1}"), k("\\grayI", "\\textcolor{##21242c}{#1}"), k("\\kaBlue", "\\textcolor{##314453}{#1}"), k("\\kaGreen", "\\textcolor{##71B307}{#1}");
+ const il = {
+ "^": !0,
+ // Parser.js
+ _: !0,
+ // Parser.js
+ "\\limits": !0,
+ // Parser.js
+ "\\nolimits": !0
+ // Parser.js
+ };
+ class Zu {
+ constructor(e, n, l) {
+ this.settings = void 0, this.expansionCount = void 0, this.lexer = void 0, this.macros = void 0, this.stack = void 0, this.mode = void 0, this.settings = n, this.expansionCount = 0, this.feed(e), this.macros = new Xu(Yu, n.macros), this.mode = l, this.stack = [];
+ }
+ /**
+ * Feed a new input string to the same MacroExpander
+ * (with existing macros etc.).
+ */
+ feed(e) {
+ this.lexer = new el(e, this.settings);
+ }
+ /**
+ * Switches between "text" and "math" modes.
+ */
+ switchMode(e) {
+ this.mode = e;
+ }
+ /**
+ * Start a new group nesting within all namespaces.
+ */
+ beginGroup() {
+ this.macros.beginGroup();
+ }
+ /**
+ * End current group nesting within all namespaces.
+ */
+ endGroup() {
+ this.macros.endGroup();
+ }
+ /**
+ * Ends all currently nested groups (if any), restoring values before the
+ * groups began. Useful in case of an error in the middle of parsing.
+ */
+ endGroups() {
+ this.macros.endGroups();
+ }
+ /**
+ * Returns the topmost token on the stack, without expanding it.
+ * Similar in behavior to TeX's `\futurelet`.
+ */
+ future() {
+ return this.stack.length === 0 && this.pushToken(this.lexer.lex()), this.stack[this.stack.length - 1];
+ }
+ /**
+ * Remove and return the next unexpanded token.
+ */
+ popToken() {
+ return this.future(), this.stack.pop();
+ }
+ /**
+ * Add a given token to the token stack. In particular, this get be used
+ * to put back a token returned from one of the other methods.
+ */
+ pushToken(e) {
+ this.stack.push(e);
+ }
+ /**
+ * Append an array of tokens to the token stack.
+ */
+ pushTokens(e) {
+ this.stack.push(...e);
+ }
+ /**
+ * Find an macro argument without expanding tokens and append the array of
+ * tokens to the token stack. Uses Token as a container for the result.
+ */
+ scanArgument(e) {
+ let n, l, c;
+ if (e) {
+ if (this.consumeSpaces(), this.future().text !== "[")
+ return null;
+ n = this.popToken(), {
+ tokens: c,
+ end: l
+ } = this.consumeArg(["]"]);
+ } else
+ ({
+ tokens: c,
+ start: n,
+ end: l
+ } = this.consumeArg());
+ return this.pushToken(new Ct("EOF", l.loc)), this.pushTokens(c), n.range(l, "");
+ }
+ /**
+ * Consume all following space tokens, without expansion.
+ */
+ consumeSpaces() {
+ for (; this.future().text === " "; )
+ this.stack.pop();
+ }
+ /**
+ * Consume an argument from the token stream, and return the resulting array
+ * of tokens and start/end token.
+ */
+ consumeArg(e) {
+ const n = [], l = e && e.length > 0;
+ l || this.consumeSpaces();
+ const c = this.future();
+ let m, b = 0, _ = 0;
+ do {
+ if (m = this.popToken(), n.push(m), m.text === "{")
+ ++b;
+ else if (m.text === "}") {
+ if (--b, b === -1)
+ throw new u("Extra }", m);
+ } else if (m.text === "EOF")
+ throw new u("Unexpected end of input in a macro argument, expected '" + (e && l ? e[_] : "}") + "'", m);
+ if (e && l)
+ if ((b === 0 || b === 1 && e[_] === "{") && m.text === e[_]) {
+ if (++_, _ === e.length) {
+ n.splice(-_, _);
+ break;
+ }
+ } else
+ _ = 0;
+ } while (b !== 0 || l);
+ return c.text === "{" && n[n.length - 1].text === "}" && (n.pop(), n.shift()), n.reverse(), {
+ tokens: n,
+ start: c,
+ end: m
+ };
+ }
+ /**
+ * Consume the specified number of (delimited) arguments from the token
+ * stream and return the resulting array of arguments.
+ */
+ consumeArgs(e, n) {
+ if (n) {
+ if (n.length !== e + 1)
+ throw new u("The length of delimiters doesn't match the number of args!");
+ const c = n[0];
+ for (let m = 0; m < c.length; m++) {
+ const b = this.popToken();
+ if (c[m] !== b.text)
+ throw new u("Use of the macro doesn't match its definition", b);
+ }
+ }
+ const l = [];
+ for (let c = 0; c < e; c++)
+ l.push(this.consumeArg(n && n[c + 1]).tokens);
+ return l;
+ }
+ /**
+ * Increment `expansionCount` by the specified amount.
+ * Throw an error if it exceeds `maxExpand`.
+ */
+ countExpansion(e) {
+ if (this.expansionCount += e, this.expansionCount > this.settings.maxExpand)
+ throw new u("Too many expansions: infinite loop or need to increase maxExpand setting");
+ }
+ /**
+ * Expand the next token only once if possible.
+ *
+ * If the token is expanded, the resulting tokens will be pushed onto
+ * the stack in reverse order, and the number of such tokens will be
+ * returned. This number might be zero or positive.
+ *
+ * If not, the return value is `false`, and the next token remains at the
+ * top of the stack.
+ *
+ * In either case, the next token will be on the top of the stack,
+ * or the stack will be empty (in case of empty expansion
+ * and no other tokens).
+ *
+ * Used to implement `expandAfterFuture` and `expandNextToken`.
+ *
+ * If expandableOnly, only expandable tokens are expanded and
+ * an undefined control sequence results in an error.
+ */
+ expandOnce(e) {
+ const n = this.popToken(), l = n.text, c = n.noexpand ? null : this._getExpansion(l);
+ if (c == null || e && c.unexpandable) {
+ if (e && c == null && l[0] === "\\" && !this.isDefined(l))
+ throw new u("Undefined control sequence: " + l);
+ return this.pushToken(n), !1;
+ }
+ this.countExpansion(1);
+ let m = c.tokens;
+ const b = this.consumeArgs(c.numArgs, c.delimiters);
+ if (c.numArgs) {
+ m = m.slice();
+ for (let _ = m.length - 1; _ >= 0; --_) {
+ let x = m[_];
+ if (x.text === "#") {
+ if (_ === 0)
+ throw new u("Incomplete placeholder at end of macro body", x);
+ if (x = m[--_], x.text === "#")
+ m.splice(_ + 1, 1);
+ else if (/^[1-9]$/.test(x.text))
+ m.splice(_, 2, ...b[+x.text - 1]);
+ else
+ throw new u("Not a valid argument number", x);
+ }
+ }
+ }
+ return this.pushTokens(m), m.length;
+ }
+ /**
+ * Expand the next token only once (if possible), and return the resulting
+ * top token on the stack (without removing anything from the stack).
+ * Similar in behavior to TeX's `\expandafter\futurelet`.
+ * Equivalent to expandOnce() followed by future().
+ */
+ expandAfterFuture() {
+ return this.expandOnce(), this.future();
+ }
+ /**
+ * Recursively expand first token, then return first non-expandable token.
+ */
+ expandNextToken() {
+ for (; ; )
+ if (this.expandOnce() === !1) {
+ const e = this.stack.pop();
+ return e.treatAsRelax && (e.text = "\\relax"), e;
+ }
+ throw new Error();
+ }
+ /**
+ * Fully expand the given macro name and return the resulting list of
+ * tokens, or return `undefined` if no such macro is defined.
+ */
+ expandMacro(e) {
+ return this.macros.has(e) ? this.expandTokens([new Ct(e)]) : void 0;
+ }
+ /**
+ * Fully expand the given token stream and return the resulting list of
+ * tokens. Note that the input tokens are in reverse order, but the
+ * output tokens are in forward order.
+ */
+ expandTokens(e) {
+ const n = [], l = this.stack.length;
+ for (this.pushTokens(e); this.stack.length > l; )
+ if (this.expandOnce(!0) === !1) {
+ const c = this.stack.pop();
+ c.treatAsRelax && (c.noexpand = !1, c.treatAsRelax = !1), n.push(c);
+ }
+ return this.countExpansion(n.length), n;
+ }
+ /**
+ * Fully expand the given macro name and return the result as a string,
+ * or return `undefined` if no such macro is defined.
+ */
+ expandMacroAsText(e) {
+ const n = this.expandMacro(e);
+ return n && n.map((l) => l.text).join("");
+ }
+ /**
+ * Returns the expanded macro as a reversed array of tokens and a macro
+ * argument count. Or returns `null` if no such macro.
+ */
+ _getExpansion(e) {
+ const n = this.macros.get(e);
+ if (n == null)
+ return n;
+ if (e.length === 1) {
+ const c = this.lexer.catcodes[e];
+ if (c != null && c !== 13)
+ return;
+ }
+ const l = typeof n == "function" ? n(this) : n;
+ if (typeof l == "string") {
+ let c = 0;
+ if (l.indexOf("#") !== -1) {
+ const F = l.replace(/##/g, "");
+ for (; F.indexOf("#" + (c + 1)) !== -1; )
+ ++c;
+ }
+ const m = new el(l, this.settings), b = [];
+ let _ = m.lex();
+ for (; _.text !== "EOF"; )
+ b.push(_), _ = m.lex();
+ return b.reverse(), {
+ tokens: b,
+ numArgs: c
+ };
+ }
+ return l;
+ }
+ /**
+ * Determine whether a command is currently "defined" (has some
+ * functionality), meaning that it's a macro (in the current group),
+ * a function, a symbol, or one of the special commands listed in
+ * `implicitCommands`.
+ */
+ isDefined(e) {
+ return this.macros.has(e) || S0.hasOwnProperty(e) || Le.math.hasOwnProperty(e) || Le.text.hasOwnProperty(e) || il.hasOwnProperty(e);
+ }
+ /**
+ * Determine whether a command is expandable.
+ */
+ isExpandable(e) {
+ const n = this.macros.get(e);
+ return n != null ? typeof n == "string" || typeof n == "function" || !n.unexpandable : S0.hasOwnProperty(e) && !S0[e].primitive;
+ }
+ }
+ const ll = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/, er = Object.freeze({
+ "₊": "+",
+ "₋": "-",
+ "₌": "=",
+ "₍": "(",
+ "₎": ")",
+ "₀": "0",
+ "₁": "1",
+ "₂": "2",
+ "₃": "3",
+ "₄": "4",
+ "₅": "5",
+ "₆": "6",
+ "₇": "7",
+ "₈": "8",
+ "₉": "9",
+ "ₐ": "a",
+ "ₑ": "e",
+ "ₕ": "h",
+ "ᵢ": "i",
+ "ⱼ": "j",
+ "ₖ": "k",
+ "ₗ": "l",
+ "ₘ": "m",
+ "ₙ": "n",
+ "ₒ": "o",
+ "ₚ": "p",
+ "ᵣ": "r",
+ "ₛ": "s",
+ "ₜ": "t",
+ "ᵤ": "u",
+ "ᵥ": "v",
+ "ₓ": "x",
+ "ᵦ": "β",
+ "ᵧ": "γ",
+ "ᵨ": "ρ",
+ "ᵩ": "ϕ",
+ "ᵪ": "χ",
+ "⁺": "+",
+ "⁻": "-",
+ "⁼": "=",
+ "⁽": "(",
+ "⁾": ")",
+ "⁰": "0",
+ "¹": "1",
+ "²": "2",
+ "³": "3",
+ "⁴": "4",
+ "⁵": "5",
+ "⁶": "6",
+ "⁷": "7",
+ "⁸": "8",
+ "⁹": "9",
+ "ᴬ": "A",
+ "ᴮ": "B",
+ "ᴰ": "D",
+ "ᴱ": "E",
+ "ᴳ": "G",
+ "ᴴ": "H",
+ "ᴵ": "I",
+ "ᴶ": "J",
+ "ᴷ": "K",
+ "ᴸ": "L",
+ "ᴹ": "M",
+ "ᴺ": "N",
+ "ᴼ": "O",
+ "ᴾ": "P",
+ "ᴿ": "R",
+ "ᵀ": "T",
+ "ᵁ": "U",
+ "ⱽ": "V",
+ "ᵂ": "W",
+ "ᵃ": "a",
+ "ᵇ": "b",
+ "ᶜ": "c",
+ "ᵈ": "d",
+ "ᵉ": "e",
+ "ᶠ": "f",
+ "ᵍ": "g",
+ ʰ: "h",
+ "ⁱ": "i",
+ ʲ: "j",
+ "ᵏ": "k",
+ ˡ: "l",
+ "ᵐ": "m",
+ ⁿ: "n",
+ "ᵒ": "o",
+ "ᵖ": "p",
+ ʳ: "r",
+ ˢ: "s",
+ "ᵗ": "t",
+ "ᵘ": "u",
+ "ᵛ": "v",
+ ʷ: "w",
+ ˣ: "x",
+ ʸ: "y",
+ "ᶻ": "z",
+ "ᵝ": "β",
+ "ᵞ": "γ",
+ "ᵟ": "δ",
+ "ᵠ": "ϕ",
+ "ᵡ": "χ",
+ "ᶿ": "θ"
+ }), as = {
+ "́": {
+ text: "\\'",
+ math: "\\acute"
+ },
+ "̀": {
+ text: "\\`",
+ math: "\\grave"
+ },
+ "̈": {
+ text: '\\"',
+ math: "\\ddot"
+ },
+ "̃": {
+ text: "\\~",
+ math: "\\tilde"
+ },
+ "̄": {
+ text: "\\=",
+ math: "\\bar"
+ },
+ "̆": {
+ text: "\\u",
+ math: "\\breve"
+ },
+ "̌": {
+ text: "\\v",
+ math: "\\check"
+ },
+ "̂": {
+ text: "\\^",
+ math: "\\hat"
+ },
+ "̇": {
+ text: "\\.",
+ math: "\\dot"
+ },
+ "̊": {
+ text: "\\r",
+ math: "\\mathring"
+ },
+ "̋": {
+ text: "\\H"
+ },
+ "̧": {
+ text: "\\c"
+ }
+ }, al = {
+ á: "á",
+ à: "à",
+ ä: "ä",
+ ǟ: "ǟ",
+ ã: "ã",
+ ā: "ā",
+ ă: "ă",
+ ắ: "ắ",
+ ằ: "ằ",
+ ẵ: "ẵ",
+ ǎ: "ǎ",
+ â: "â",
+ ấ: "ấ",
+ ầ: "ầ",
+ ẫ: "ẫ",
+ ȧ: "ȧ",
+ ǡ: "ǡ",
+ å: "å",
+ ǻ: "ǻ",
+ ḃ: "ḃ",
+ ć: "ć",
+ ḉ: "ḉ",
+ č: "č",
+ ĉ: "ĉ",
+ ċ: "ċ",
+ ç: "ç",
+ ď: "ď",
+ ḋ: "ḋ",
+ ḑ: "ḑ",
+ é: "é",
+ è: "è",
+ ë: "ë",
+ ẽ: "ẽ",
+ ē: "ē",
+ ḗ: "ḗ",
+ ḕ: "ḕ",
+ ĕ: "ĕ",
+ ḝ: "ḝ",
+ ě: "ě",
+ ê: "ê",
+ ế: "ế",
+ ề: "ề",
+ ễ: "ễ",
+ ė: "ė",
+ ȩ: "ȩ",
+ ḟ: "ḟ",
+ ǵ: "ǵ",
+ ḡ: "ḡ",
+ ğ: "ğ",
+ ǧ: "ǧ",
+ ĝ: "ĝ",
+ ġ: "ġ",
+ ģ: "ģ",
+ ḧ: "ḧ",
+ ȟ: "ȟ",
+ ĥ: "ĥ",
+ ḣ: "ḣ",
+ ḩ: "ḩ",
+ í: "í",
+ ì: "ì",
+ ï: "ï",
+ ḯ: "ḯ",
+ ĩ: "ĩ",
+ ī: "ī",
+ ĭ: "ĭ",
+ ǐ: "ǐ",
+ î: "î",
+ ǰ: "ǰ",
+ ĵ: "ĵ",
+ ḱ: "ḱ",
+ ǩ: "ǩ",
+ ķ: "ķ",
+ ĺ: "ĺ",
+ ľ: "ľ",
+ ļ: "ļ",
+ ḿ: "ḿ",
+ ṁ: "ṁ",
+ ń: "ń",
+ ǹ: "ǹ",
+ ñ: "ñ",
+ ň: "ň",
+ ṅ: "ṅ",
+ ņ: "ņ",
+ ó: "ó",
+ ò: "ò",
+ ö: "ö",
+ ȫ: "ȫ",
+ õ: "õ",
+ ṍ: "ṍ",
+ ṏ: "ṏ",
+ ȭ: "ȭ",
+ ō: "ō",
+ ṓ: "ṓ",
+ ṑ: "ṑ",
+ ŏ: "ŏ",
+ ǒ: "ǒ",
+ ô: "ô",
+ ố: "ố",
+ ồ: "ồ",
+ ỗ: "ỗ",
+ ȯ: "ȯ",
+ ȱ: "ȱ",
+ ő: "ő",
+ ṕ: "ṕ",
+ ṗ: "ṗ",
+ ŕ: "ŕ",
+ ř: "ř",
+ ṙ: "ṙ",
+ ŗ: "ŗ",
+ ś: "ś",
+ ṥ: "ṥ",
+ š: "š",
+ ṧ: "ṧ",
+ ŝ: "ŝ",
+ ṡ: "ṡ",
+ ş: "ş",
+ ẗ: "ẗ",
+ ť: "ť",
+ ṫ: "ṫ",
+ ţ: "ţ",
+ ú: "ú",
+ ù: "ù",
+ ü: "ü",
+ ǘ: "ǘ",
+ ǜ: "ǜ",
+ ǖ: "ǖ",
+ ǚ: "ǚ",
+ ũ: "ũ",
+ ṹ: "ṹ",
+ ū: "ū",
+ ṻ: "ṻ",
+ ŭ: "ŭ",
+ ǔ: "ǔ",
+ û: "û",
+ ů: "ů",
+ ű: "ű",
+ ṽ: "ṽ",
+ ẃ: "ẃ",
+ ẁ: "ẁ",
+ ẅ: "ẅ",
+ ŵ: "ŵ",
+ ẇ: "ẇ",
+ ẘ: "ẘ",
+ ẍ: "ẍ",
+ ẋ: "ẋ",
+ ý: "ý",
+ ỳ: "ỳ",
+ ÿ: "ÿ",
+ ỹ: "ỹ",
+ ȳ: "ȳ",
+ ŷ: "ŷ",
+ ẏ: "ẏ",
+ ẙ: "ẙ",
+ ź: "ź",
+ ž: "ž",
+ ẑ: "ẑ",
+ ż: "ż",
+ Á: "Á",
+ À: "À",
+ Ä: "Ä",
+ Ǟ: "Ǟ",
+ Ã: "Ã",
+ Ā: "Ā",
+ Ă: "Ă",
+ Ắ: "Ắ",
+ Ằ: "Ằ",
+ Ẵ: "Ẵ",
+ Ǎ: "Ǎ",
+ Â: "Â",
+ Ấ: "Ấ",
+ Ầ: "Ầ",
+ Ẫ: "Ẫ",
+ Ȧ: "Ȧ",
+ Ǡ: "Ǡ",
+ Å: "Å",
+ Ǻ: "Ǻ",
+ Ḃ: "Ḃ",
+ Ć: "Ć",
+ Ḉ: "Ḉ",
+ Č: "Č",
+ Ĉ: "Ĉ",
+ Ċ: "Ċ",
+ Ç: "Ç",
+ Ď: "Ď",
+ Ḋ: "Ḋ",
+ Ḑ: "Ḑ",
+ É: "É",
+ È: "È",
+ Ë: "Ë",
+ Ẽ: "Ẽ",
+ Ē: "Ē",
+ Ḗ: "Ḗ",
+ Ḕ: "Ḕ",
+ Ĕ: "Ĕ",
+ Ḝ: "Ḝ",
+ Ě: "Ě",
+ Ê: "Ê",
+ Ế: "Ế",
+ Ề: "Ề",
+ Ễ: "Ễ",
+ Ė: "Ė",
+ Ȩ: "Ȩ",
+ Ḟ: "Ḟ",
+ Ǵ: "Ǵ",
+ Ḡ: "Ḡ",
+ Ğ: "Ğ",
+ Ǧ: "Ǧ",
+ Ĝ: "Ĝ",
+ Ġ: "Ġ",
+ Ģ: "Ģ",
+ Ḧ: "Ḧ",
+ Ȟ: "Ȟ",
+ Ĥ: "Ĥ",
+ Ḣ: "Ḣ",
+ Ḩ: "Ḩ",
+ Í: "Í",
+ Ì: "Ì",
+ Ï: "Ï",
+ Ḯ: "Ḯ",
+ Ĩ: "Ĩ",
+ Ī: "Ī",
+ Ĭ: "Ĭ",
+ Ǐ: "Ǐ",
+ Î: "Î",
+ İ: "İ",
+ Ĵ: "Ĵ",
+ Ḱ: "Ḱ",
+ Ǩ: "Ǩ",
+ Ķ: "Ķ",
+ Ĺ: "Ĺ",
+ Ľ: "Ľ",
+ Ļ: "Ļ",
+ Ḿ: "Ḿ",
+ Ṁ: "Ṁ",
+ Ń: "Ń",
+ Ǹ: "Ǹ",
+ Ñ: "Ñ",
+ Ň: "Ň",
+ Ṅ: "Ṅ",
+ Ņ: "Ņ",
+ Ó: "Ó",
+ Ò: "Ò",
+ Ö: "Ö",
+ Ȫ: "Ȫ",
+ Õ: "Õ",
+ Ṍ: "Ṍ",
+ Ṏ: "Ṏ",
+ Ȭ: "Ȭ",
+ Ō: "Ō",
+ Ṓ: "Ṓ",
+ Ṑ: "Ṑ",
+ Ŏ: "Ŏ",
+ Ǒ: "Ǒ",
+ Ô: "Ô",
+ Ố: "Ố",
+ Ồ: "Ồ",
+ Ỗ: "Ỗ",
+ Ȯ: "Ȯ",
+ Ȱ: "Ȱ",
+ Ő: "Ő",
+ Ṕ: "Ṕ",
+ Ṗ: "Ṗ",
+ Ŕ: "Ŕ",
+ Ř: "Ř",
+ Ṙ: "Ṙ",
+ Ŗ: "Ŗ",
+ Ś: "Ś",
+ Ṥ: "Ṥ",
+ Š: "Š",
+ Ṧ: "Ṧ",
+ Ŝ: "Ŝ",
+ Ṡ: "Ṡ",
+ Ş: "Ş",
+ Ť: "Ť",
+ Ṫ: "Ṫ",
+ Ţ: "Ţ",
+ Ú: "Ú",
+ Ù: "Ù",
+ Ü: "Ü",
+ Ǘ: "Ǘ",
+ Ǜ: "Ǜ",
+ Ǖ: "Ǖ",
+ Ǚ: "Ǚ",
+ Ũ: "Ũ",
+ Ṹ: "Ṹ",
+ Ū: "Ū",
+ Ṻ: "Ṻ",
+ Ŭ: "Ŭ",
+ Ǔ: "Ǔ",
+ Û: "Û",
+ Ů: "Ů",
+ Ű: "Ű",
+ Ṽ: "Ṽ",
+ Ẃ: "Ẃ",
+ Ẁ: "Ẁ",
+ Ẅ: "Ẅ",
+ Ŵ: "Ŵ",
+ Ẇ: "Ẇ",
+ Ẍ: "Ẍ",
+ Ẋ: "Ẋ",
+ Ý: "Ý",
+ Ỳ: "Ỳ",
+ Ÿ: "Ÿ",
+ Ỹ: "Ỹ",
+ Ȳ: "Ȳ",
+ Ŷ: "Ŷ",
+ Ẏ: "Ẏ",
+ Ź: "Ź",
+ Ž: "Ž",
+ Ẑ: "Ẑ",
+ Ż: "Ż",
+ ά: "ά",
+ ὰ: "ὰ",
+ ᾱ: "ᾱ",
+ ᾰ: "ᾰ",
+ έ: "έ",
+ ὲ: "ὲ",
+ ή: "ή",
+ ὴ: "ὴ",
+ ί: "ί",
+ ὶ: "ὶ",
+ ϊ: "ϊ",
+ ΐ: "ΐ",
+ ῒ: "ῒ",
+ ῑ: "ῑ",
+ ῐ: "ῐ",
+ ό: "ό",
+ ὸ: "ὸ",
+ ύ: "ύ",
+ ὺ: "ὺ",
+ ϋ: "ϋ",
+ ΰ: "ΰ",
+ ῢ: "ῢ",
+ ῡ: "ῡ",
+ ῠ: "ῠ",
+ ώ: "ώ",
+ ὼ: "ὼ",
+ Ύ: "Ύ",
+ Ὺ: "Ὺ",
+ Ϋ: "Ϋ",
+ Ῡ: "Ῡ",
+ Ῠ: "Ῠ",
+ Ώ: "Ώ",
+ Ὼ: "Ὼ"
+ };
+ class tr {
+ constructor(e, n) {
+ this.mode = void 0, this.gullet = void 0, this.settings = void 0, this.leftrightDepth = void 0, this.nextToken = void 0, this.mode = "math", this.gullet = new Zu(e, n, this.mode), this.settings = n, this.leftrightDepth = 0;
+ }
+ /**
+ * Checks a result to make sure it has the right type, and throws an
+ * appropriate error otherwise.
+ */
+ expect(e, n) {
+ if (n === void 0 && (n = !0), this.fetch().text !== e)
+ throw new u("Expected '" + e + "', got '" + this.fetch().text + "'", this.fetch());
+ n && this.consume();
+ }
+ /**
+ * Discards the current lookahead token, considering it consumed.
+ */
+ consume() {
+ this.nextToken = null;
+ }
+ /**
+ * Return the current lookahead token, or if there isn't one (at the
+ * beginning, or if the previous lookahead token was consume()d),
+ * fetch the next token as the new lookahead token and return it.
+ */
+ fetch() {
+ return this.nextToken == null && (this.nextToken = this.gullet.expandNextToken()), this.nextToken;
+ }
+ /**
+ * Switches between "text" and "math" modes.
+ */
+ switchMode(e) {
+ this.mode = e, this.gullet.switchMode(e);
+ }
+ /**
+ * Main parsing function, which parses an entire input.
+ */
+ parse() {
+ this.settings.globalGroup || this.gullet.beginGroup(), this.settings.colorIsTextColor && this.gullet.macros.set("\\color", "\\textcolor");
+ try {
+ const e = this.parseExpression(!1);
+ return this.expect("EOF"), this.settings.globalGroup || this.gullet.endGroup(), e;
+ } finally {
+ this.gullet.endGroups();
+ }
+ }
+ /**
+ * Fully parse a separate sequence of tokens as a separate job.
+ * Tokens should be specified in reverse order, as in a MacroDefinition.
+ */
+ subparse(e) {
+ const n = this.nextToken;
+ this.consume(), this.gullet.pushToken(new Ct("}")), this.gullet.pushTokens(e);
+ const l = this.parseExpression(!1);
+ return this.expect("}"), this.nextToken = n, l;
+ }
+ /**
+ * Parses an "expression", which is a list of atoms.
+ *
+ * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This
+ * happens when functions have higher precedence han infix
+ * nodes in implicit parses.
+ *
+ * `breakOnTokenText`: The text of the token that the expression should end
+ * with, or `null` if something else should end the
+ * expression.
+ */
+ parseExpression(e, n) {
+ const l = [];
+ for (; ; ) {
+ this.mode === "math" && this.consumeSpaces();
+ const c = this.fetch();
+ if (tr.endOfExpression.indexOf(c.text) !== -1 || n && c.text === n || e && S0[c.text] && S0[c.text].infix)
+ break;
+ const m = this.parseAtom(n);
+ if (m) {
+ if (m.type === "internal")
+ continue;
+ } else
+ break;
+ l.push(m);
+ }
+ return this.mode === "text" && this.formLigatures(l), this.handleInfixNodes(l);
+ }
+ /**
+ * Rewrites infix operators such as \over with corresponding commands such
+ * as \frac.
+ *
+ * There can only be one infix operator per group. If there's more than one
+ * then the expression is ambiguous. This can be resolved by adding {}.
+ */
+ handleInfixNodes(e) {
+ let n = -1, l;
+ for (let c = 0; c < e.length; c++)
+ if (e[c].type === "infix") {
+ if (n !== -1)
+ throw new u("only one infix operator per group", e[c].token);
+ n = c, l = e[c].replaceWith;
+ }
+ if (n !== -1 && l) {
+ let c, m;
+ const b = e.slice(0, n), _ = e.slice(n + 1);
+ b.length === 1 && b[0].type === "ordgroup" ? c = b[0] : c = {
+ type: "ordgroup",
+ mode: this.mode,
+ body: b
+ }, _.length === 1 && _[0].type === "ordgroup" ? m = _[0] : m = {
+ type: "ordgroup",
+ mode: this.mode,
+ body: _
+ };
+ let x;
+ return l === "\\\\abovefrac" ? x = this.callFunction(l, [c, e[n], m], []) : x = this.callFunction(l, [c, m], []), [x];
+ } else
+ return e;
+ }
+ /**
+ * Handle a subscript or superscript with nice errors.
+ */
+ handleSupSubscript(e) {
+ const n = this.fetch(), l = n.text;
+ this.consume(), this.consumeSpaces();
+ const c = this.parseGroup(e);
+ if (!c)
+ throw new u("Expected group after '" + l + "'", n);
+ return c;
+ }
+ /**
+ * Converts the textual input of an unsupported command into a text node
+ * contained within a color node whose color is determined by errorColor
+ */
+ formatUnsupportedCmd(e) {
+ const n = [];
+ for (let m = 0; m < e.length; m++)
+ n.push({
+ type: "textord",
+ mode: "text",
+ text: e[m]
+ });
+ const l = {
+ type: "text",
+ mode: this.mode,
+ body: n
+ };
+ return {
+ type: "color",
+ mode: this.mode,
+ color: this.settings.errorColor,
+ body: [l]
+ };
+ }
+ /**
+ * Parses a group with optional super/subscripts.
+ */
+ parseAtom(e) {
+ const n = this.parseGroup("atom", e);
+ if (this.mode === "text")
+ return n;
+ let l, c;
+ for (; ; ) {
+ this.consumeSpaces();
+ const m = this.fetch();
+ if (m.text === "\\limits" || m.text === "\\nolimits") {
+ if (n && n.type === "op") {
+ const b = m.text === "\\limits";
+ n.limits = b, n.alwaysHandleSupSub = !0;
+ } else if (n && n.type === "operatorname")
+ n.alwaysHandleSupSub && (n.limits = m.text === "\\limits");
+ else
+ throw new u("Limit controls must follow a math operator", m);
+ this.consume();
+ } else if (m.text === "^") {
+ if (l)
+ throw new u("Double superscript", m);
+ l = this.handleSupSubscript("superscript");
+ } else if (m.text === "_") {
+ if (c)
+ throw new u("Double subscript", m);
+ c = this.handleSupSubscript("subscript");
+ } else if (m.text === "'") {
+ if (l)
+ throw new u("Double superscript", m);
+ const b = {
+ type: "textord",
+ mode: this.mode,
+ text: "\\prime"
+ }, _ = [b];
+ for (this.consume(); this.fetch().text === "'"; )
+ _.push(b), this.consume();
+ this.fetch().text === "^" && _.push(this.handleSupSubscript("superscript")), l = {
+ type: "ordgroup",
+ mode: this.mode,
+ body: _
+ };
+ } else if (er[m.text]) {
+ const b = ll.test(m.text), _ = [];
+ for (_.push(new Ct(er[m.text])), this.consume(); ; ) {
+ const F = this.fetch().text;
+ if (!er[F] || ll.test(F) !== b)
+ break;
+ _.unshift(new Ct(er[F])), this.consume();
+ }
+ const x = this.subparse(_);
+ b ? c = {
+ type: "ordgroup",
+ mode: "math",
+ body: x
+ } : l = {
+ type: "ordgroup",
+ mode: "math",
+ body: x
+ };
+ } else
+ break;
+ }
+ return l || c ? {
+ type: "supsub",
+ mode: this.mode,
+ base: n,
+ sup: l,
+ sub: c
+ } : n;
+ }
+ /**
+ * Parses an entire function, including its base and all of its arguments.
+ */
+ parseFunction(e, n) {
+ const l = this.fetch(), c = l.text, m = S0[c];
+ if (!m)
+ return null;
+ if (this.consume(), n && n !== "atom" && !m.allowedInArgument)
+ throw new u("Got function '" + c + "' with no arguments" + (n ? " as " + n : ""), l);
+ if (this.mode === "text" && !m.allowedInText)
+ throw new u("Can't use function '" + c + "' in text mode", l);
+ if (this.mode === "math" && m.allowedInMath === !1)
+ throw new u("Can't use function '" + c + "' in math mode", l);
+ const {
+ args: b,
+ optArgs: _
+ } = this.parseArguments(c, m);
+ return this.callFunction(c, b, _, l, e);
+ }
+ /**
+ * Call a function handler with a suitable context and arguments.
+ */
+ callFunction(e, n, l, c, m) {
+ const b = {
+ funcName: e,
+ parser: this,
+ token: c,
+ breakOnTokenText: m
+ }, _ = S0[e];
+ if (_ && _.handler)
+ return _.handler(b, n, l);
+ throw new u("No function handler for " + e);
+ }
+ /**
+ * Parses the arguments of a function or environment
+ */
+ parseArguments(e, n) {
+ const l = n.numArgs + n.numOptionalArgs;
+ if (l === 0)
+ return {
+ args: [],
+ optArgs: []
+ };
+ const c = [], m = [];
+ for (let b = 0; b < l; b++) {
+ let _ = n.argTypes && n.argTypes[b];
+ const x = b < n.numOptionalArgs;
+ (n.primitive && _ == null || // \sqrt expands into primitive if optional argument doesn't exist
+ n.type === "sqrt" && b === 1 && m[0] == null) && (_ = "primitive");
+ const F = this.parseGroupOfType("argument to '" + e + "'", _, x);
+ if (x)
+ m.push(F);
+ else if (F != null)
+ c.push(F);
+ else
+ throw new u("Null argument, please report this as a bug");
+ }
+ return {
+ args: c,
+ optArgs: m
+ };
+ }
+ /**
+ * Parses a group when the mode is changing.
+ */
+ parseGroupOfType(e, n, l) {
+ switch (n) {
+ case "color":
+ return this.parseColorGroup(l);
+ case "size":
+ return this.parseSizeGroup(l);
+ case "url":
+ return this.parseUrlGroup(l);
+ case "math":
+ case "text":
+ return this.parseArgumentGroup(l, n);
+ case "hbox": {
+ const c = this.parseArgumentGroup(l, "text");
+ return c != null ? {
+ type: "styling",
+ mode: c.mode,
+ body: [c],
+ style: "text"
+ // simulate \textstyle
+ } : null;
+ }
+ case "raw": {
+ const c = this.parseStringGroup("raw", l);
+ return c != null ? {
+ type: "raw",
+ mode: "text",
+ string: c.text
+ } : null;
+ }
+ case "primitive": {
+ if (l)
+ throw new u("A primitive argument cannot be optional");
+ const c = this.parseGroup(e);
+ if (c == null)
+ throw new u("Expected group as " + e, this.fetch());
+ return c;
+ }
+ case "original":
+ case null:
+ case void 0:
+ return this.parseArgumentGroup(l);
+ default:
+ throw new u("Unknown group type as " + e, this.fetch());
+ }
+ }
+ /**
+ * Discard any space tokens, fetching the next non-space token.
+ */
+ consumeSpaces() {
+ for (; this.fetch().text === " "; )
+ this.consume();
+ }
+ /**
+ * Parses a group, essentially returning the string formed by the
+ * brace-enclosed tokens plus some position information.
+ */
+ parseStringGroup(e, n) {
+ const l = this.gullet.scanArgument(n);
+ if (l == null)
+ return null;
+ let c = "", m;
+ for (; (m = this.fetch()).text !== "EOF"; )
+ c += m.text, this.consume();
+ return this.consume(), l.text = c, l;
+ }
+ /**
+ * Parses a regex-delimited group: the largest sequence of tokens
+ * whose concatenated strings match `regex`. Returns the string
+ * formed by the tokens plus some position information.
+ */
+ parseRegexGroup(e, n) {
+ const l = this.fetch();
+ let c = l, m = "", b;
+ for (; (b = this.fetch()).text !== "EOF" && e.test(m + b.text); )
+ c = b, m += c.text, this.consume();
+ if (m === "")
+ throw new u("Invalid " + n + ": '" + l.text + "'", l);
+ return l.range(c, m);
+ }
+ /**
+ * Parses a color description.
+ */
+ parseColorGroup(e) {
+ const n = this.parseStringGroup("color", e);
+ if (n == null)
+ return null;
+ const l = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(n.text);
+ if (!l)
+ throw new u("Invalid color: '" + n.text + "'", n);
+ let c = l[0];
+ return /^[0-9a-f]{6}$/i.test(c) && (c = "#" + c), {
+ type: "color-token",
+ mode: this.mode,
+ color: c
+ };
+ }
+ /**
+ * Parses a size specification, consisting of magnitude and unit.
+ */
+ parseSizeGroup(e) {
+ let n, l = !1;
+ if (this.gullet.consumeSpaces(), !e && this.gullet.future().text !== "{" ? n = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size") : n = this.parseStringGroup("size", e), !n)
+ return null;
+ !e && n.text.length === 0 && (n.text = "0pt", l = !0);
+ const c = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(n.text);
+ if (!c)
+ throw new u("Invalid size: '" + n.text + "'", n);
+ const m = {
+ number: +(c[1] + c[2]),
+ // sign + magnitude, cast to number
+ unit: c[3]
+ };
+ if (!u0(m))
+ throw new u("Invalid unit: '" + m.unit + "'", n);
+ return {
+ type: "size",
+ mode: this.mode,
+ value: m,
+ isBlank: l
+ };
+ }
+ /**
+ * Parses an URL, checking escaped letters and allowed protocols,
+ * and setting the catcode of % as an active character (as in \hyperref).
+ */
+ parseUrlGroup(e) {
+ this.gullet.lexer.setCatcode("%", 13), this.gullet.lexer.setCatcode("~", 12);
+ const n = this.parseStringGroup("url", e);
+ if (this.gullet.lexer.setCatcode("%", 14), this.gullet.lexer.setCatcode("~", 13), n == null)
+ return null;
+ const l = n.text.replace(/\\([#$%&~_^{}])/g, "$1");
+ return {
+ type: "url",
+ mode: this.mode,
+ url: l
+ };
+ }
+ /**
+ * Parses an argument with the mode specified.
+ */
+ parseArgumentGroup(e, n) {
+ const l = this.gullet.scanArgument(e);
+ if (l == null)
+ return null;
+ const c = this.mode;
+ n && this.switchMode(n), this.gullet.beginGroup();
+ const m = this.parseExpression(!1, "EOF");
+ this.expect("EOF"), this.gullet.endGroup();
+ const b = {
+ type: "ordgroup",
+ mode: this.mode,
+ loc: l.loc,
+ body: m
+ };
+ return n && this.switchMode(c), b;
+ }
+ /**
+ * Parses an ordinary group, which is either a single nucleus (like "x")
+ * or an expression in braces (like "{x+y}") or an implicit group, a group
+ * that starts at the current position, and ends right before a higher explicit
+ * group ends, or at EOF.
+ */
+ parseGroup(e, n) {
+ const l = this.fetch(), c = l.text;
+ let m;
+ if (c === "{" || c === "\\begingroup") {
+ this.consume();
+ const b = c === "{" ? "}" : "\\endgroup";
+ this.gullet.beginGroup();
+ const _ = this.parseExpression(!1, b), x = this.fetch();
+ this.expect(b), this.gullet.endGroup(), m = {
+ type: "ordgroup",
+ mode: this.mode,
+ loc: bt.range(l, x),
+ body: _,
+ // A group formed by \begingroup...\endgroup is a semi-simple group
+ // which doesn't affect spacing in math mode, i.e., is transparent.
+ // https://tex.stackexchange.com/questions/1930/when-should-one-
+ // use-begingroup-instead-of-bgroup
+ semisimple: c === "\\begingroup" || void 0
+ };
+ } else if (m = this.parseFunction(n, e) || this.parseSymbol(), m == null && c[0] === "\\" && !il.hasOwnProperty(c)) {
+ if (this.settings.throwOnError)
+ throw new u("Undefined control sequence: " + c, l);
+ m = this.formatUnsupportedCmd(c), this.consume();
+ }
+ return m;
+ }
+ /**
+ * Form ligature-like combinations of characters for text mode.
+ * This includes inputs like "--", "---", "``" and "''".
+ * The result will simply replace multiple textord nodes with a single
+ * character in each value by a single textord node having multiple
+ * characters in its value. The representation is still ASCII source.
+ * The group will be modified in place.
+ */
+ formLigatures(e) {
+ let n = e.length - 1;
+ for (let l = 0; l < n; ++l) {
+ const c = e[l], m = c.text;
+ m === "-" && e[l + 1].text === "-" && (l + 1 < n && e[l + 2].text === "-" ? (e.splice(l, 3, {
+ type: "textord",
+ mode: "text",
+ loc: bt.range(c, e[l + 2]),
+ text: "---"
+ }), n -= 2) : (e.splice(l, 2, {
+ type: "textord",
+ mode: "text",
+ loc: bt.range(c, e[l + 1]),
+ text: "--"
+ }), n -= 1)), (m === "'" || m === "`") && e[l + 1].text === m && (e.splice(l, 2, {
+ type: "textord",
+ mode: "text",
+ loc: bt.range(c, e[l + 1]),
+ text: m + m
+ }), n -= 1);
+ }
+ }
+ /**
+ * Parse a single symbol out of the string. Here, we handle single character
+ * symbols and special functions like \verb.
+ */
+ parseSymbol() {
+ const e = this.fetch();
+ let n = e.text;
+ if (/^\\verb[^a-zA-Z]/.test(n)) {
+ this.consume();
+ let m = n.slice(5);
+ const b = m.charAt(0) === "*";
+ if (b && (m = m.slice(1)), m.length < 2 || m.charAt(0) !== m.slice(-1))
+ throw new u(`\\verb assertion failed --
+ please report what input caused this bug`);
+ return m = m.slice(1, -1), {
+ type: "verb",
+ mode: "text",
+ body: m,
+ star: b
+ };
+ }
+ al.hasOwnProperty(n[0]) && !Le[this.mode][n[0]] && (this.settings.strict && this.mode === "math" && this.settings.reportNonstrict("unicodeTextInMathMode", 'Accented Unicode text character "' + n[0] + '" used in math mode', e), n = al[n[0]] + n.slice(1));
+ const l = Wu.exec(n);
+ l && (n = n.substring(0, l.index), n === "i" ? n = "ı" : n === "j" && (n = "ȷ"));
+ let c;
+ if (Le[this.mode][n]) {
+ this.settings.strict && this.mode === "math" && tn.indexOf(n) >= 0 && this.settings.reportNonstrict("unicodeTextInMathMode", 'Latin-1/Unicode text character "' + n[0] + '" used in math mode', e);
+ const m = Le[this.mode][n].group, b = bt.range(e);
+ let _;
+ if (Mr.hasOwnProperty(m)) {
+ const x = m;
+ _ = {
+ type: "atom",
+ mode: this.mode,
+ family: x,
+ loc: b,
+ text: n
+ };
+ } else
+ _ = {
+ type: m,
+ mode: this.mode,
+ loc: b,
+ text: n
+ };
+ c = _;
+ } else if (n.charCodeAt(0) >= 128)
+ this.settings.strict && (tt(n.charCodeAt(0)) ? this.mode === "math" && this.settings.reportNonstrict("unicodeTextInMathMode", 'Unicode text character "' + n[0] + '" used in math mode', e) : this.settings.reportNonstrict("unknownSymbol", 'Unrecognized Unicode character "' + n[0] + '"' + (" (" + n.charCodeAt(0) + ")"), e)), c = {
+ type: "textord",
+ mode: "text",
+ loc: bt.range(e),
+ text: n
+ };
+ else
+ return null;
+ if (this.consume(), l)
+ for (let m = 0; m < l[0].length; m++) {
+ const b = l[0][m];
+ if (!as[b])
+ throw new u("Unknown accent ' " + b + "'", e);
+ const _ = as[b][this.mode] || as[b].text;
+ if (!_)
+ throw new u("Accent " + b + " unsupported in " + this.mode + " mode", e);
+ c = {
+ type: "accent",
+ mode: this.mode,
+ loc: bt.range(e),
+ label: _,
+ isStretchy: !1,
+ isShifty: !0,
+ // $FlowFixMe
+ base: c
+ };
+ }
+ return c;
+ }
+ }
+ tr.endOfExpression = ["}", "\\endgroup", "\\end", "\\right", "&"];
+ var os = function(t, e) {
+ if (!(typeof t == "string" || t instanceof String))
+ throw new TypeError("KaTeX can only parse string typed expression");
+ const n = new tr(t, e);
+ delete n.gullet.macros.current["\\df@tag"];
+ let l = n.parse();
+ if (delete n.gullet.macros.current["\\current@color"], delete n.gullet.macros.current["\\color"], n.gullet.macros.get("\\df@tag")) {
+ if (!e.displayMode)
+ throw new u("\\tag works only in display equations");
+ l = [{
+ type: "tag",
+ mode: "text",
+ body: l,
+ tag: n.subparse([new Ct("\\df@tag")])
+ }];
+ }
+ return l;
+ };
+ let ol = function(t, e, n) {
+ e.textContent = "";
+ const l = us(t, n).toNode();
+ e.appendChild(l);
+ };
+ typeof document < "u" && document.compatMode !== "CSS1Compat" && (typeof console < "u" && console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your website has a suitable doctype."), ol = function() {
+ throw new u("KaTeX doesn't work in quirks mode.");
+ });
+ const Ku = function(t, e) {
+ return us(t, e).toMarkup();
+ }, Qu = function(t, e) {
+ const n = new M(e);
+ return os(t, n);
+ }, ul = function(t, e, n) {
+ if (n.throwOnError || !(t instanceof u))
+ throw t;
+ const l = O.makeSpan(["katex-error"], [new st(e)]);
+ return l.setAttribute("title", t.toString()), l.setAttribute("style", "color:" + n.errorColor), l;
+ }, us = function(t, e) {
+ const n = new M(e);
+ try {
+ const l = os(t, n);
+ return fu(l, t, n);
+ } catch (l) {
+ return ul(l, t, n);
+ }
+ };
+ var Ju = {
+ /**
+ * Current KaTeX version
+ */
+ version: "0.16.10",
+ /**
+ * Renders the given LaTeX into an HTML+MathML combination, and adds
+ * it as a child to the specified DOM node.
+ */
+ render: ol,
+ /**
+ * Renders the given LaTeX into an HTML+MathML combination string,
+ * for sending to the client.
+ */
+ renderToString: Ku,
+ /**
+ * KaTeX error, usually during parsing.
+ */
+ ParseError: u,
+ /**
+ * The shema of Settings
+ */
+ SETTINGS_SCHEMA: N,
+ /**
+ * Parses the given LaTeX into KaTeX's internal parse tree structure,
+ * without rendering to HTML or MathML.
+ *
+ * NOTE: This method is not currently recommended for public use.
+ * The internal tree representation is unstable and is very likely
+ * to change. Use at your own risk.
+ */
+ __parse: Qu,
+ /**
+ * Renders the given LaTeX into an HTML+MathML internal DOM tree
+ * representation, without flattening that representation to a string.
+ *
+ * NOTE: This method is not currently recommended for public use.
+ * The internal tree representation is unstable and is very likely
+ * to change. Use at your own risk.
+ */
+ __renderToDomTree: us,
+ /**
+ * Renders the given LaTeX into an HTML internal DOM tree representation,
+ * without MathML and without flattening that representation to a string.
+ *
+ * NOTE: This method is not currently recommended for public use.
+ * The internal tree representation is unstable and is very likely
+ * to change. Use at your own risk.
+ */
+ __renderToHTMLTree: function(t, e) {
+ const n = new M(e);
+ try {
+ const l = os(t, n);
+ return du(l, t, n);
+ } catch (l) {
+ return ul(l, t, n);
+ }
+ },
+ /**
+ * extends internal font metrics object with a new object
+ * each key in the new object represents a font name
+ */
+ __setFontMetrics: O0,
+ /**
+ * adds a new symbol to builtin symbols table
+ */
+ __defineSymbol: h,
+ /**
+ * adds a new function to builtin function list,
+ * which directly produce parse tree elements
+ * and have their own html/mathml builders
+ */
+ __defineFunction: ne,
+ /**
+ * adds a new macro to builtin macro list
+ */
+ __defineMacro: k,
+ /**
+ * Expose the dom tree node types, which can be useful for type checking nodes.
+ *
+ * NOTE: This method is not currently recommended for public use.
+ * The internal tree representation is unstable and is very likely
+ * to change. Use at your own risk.
+ */
+ __domTree: {
+ Span: Ge,
+ Anchor: Yt,
+ SymbolNode: st,
+ SvgNode: St,
+ PathNode: Pt,
+ LineNode: bn
+ }
+ }, $u = Ju;
+ return i = i.default, i;
+ }()
+ );
+ });
+ }(As)), As.exports;
+}
+(function(a, r) {
+ (function(i, o) {
+ a.exports = o(j4());
+ })(typeof self < "u" ? self : yr, function(s) {
+ return (
+ /******/
+ function() {
+ var i = {
+ /***/
+ 771: (
+ /***/
+ function(p) {
+ p.exports = s;
+ }
+ )
+ /******/
+ }, o = {};
+ function u(p) {
+ var g = o[p];
+ if (g !== void 0)
+ return g.exports;
+ var y = o[p] = {
+ /******/
+ // no module.id needed
+ /******/
+ // no module.loaded needed
+ /******/
+ exports: {}
+ /******/
+ };
+ return i[p](y, y.exports, u), y.exports;
+ }
+ (function() {
+ u.n = function(p) {
+ var g = p && p.__esModule ? (
+ /******/
+ function() {
+ return p.default;
+ }
+ ) : (
+ /******/
+ function() {
+ return p;
+ }
+ );
+ return u.d(g, { a: g }), g;
+ };
+ })(), function() {
+ u.d = function(p, g) {
+ for (var y in g)
+ u.o(g, y) && !u.o(p, y) && Object.defineProperty(p, y, { enumerable: !0, get: g[y] });
+ };
+ }(), function() {
+ u.o = function(p, g) {
+ return Object.prototype.hasOwnProperty.call(p, g);
+ };
+ }();
+ var f = {};
+ return function() {
+ u.d(f, {
+ default: function() {
+ return (
+ /* binding */
+ R
+ );
+ }
+ });
+ var p = u(771), g = /* @__PURE__ */ u.n(p);
+ const y = function(N, S, M) {
+ let L = M, z = 0;
+ const H = N.length;
+ for (; L < S.length; ) {
+ const te = S[L];
+ if (z <= 0 && S.slice(L, L + H) === N)
+ return L;
+ te === "\\" ? L++ : te === "{" ? z++ : te === "}" && z--, L++;
+ }
+ return -1;
+ }, D = function(N) {
+ return N.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
+ }, T = /^\\begin{/;
+ var U = function(N, S) {
+ let M;
+ const L = [], z = new RegExp("(" + S.map((H) => D(H.left)).join("|") + ")");
+ for (; M = N.search(z), M !== -1; ) {
+ M > 0 && (L.push({
+ type: "text",
+ data: N.slice(0, M)
+ }), N = N.slice(M));
+ const H = S.findIndex((ce) => N.startsWith(ce.left));
+ if (M = y(S[H].right, N, S[H].left.length), M === -1)
+ break;
+ const te = N.slice(0, M + S[H].right.length), Q = T.test(te) ? te : N.slice(S[H].left.length, M);
+ L.push({
+ type: "math",
+ data: Q,
+ rawData: te,
+ display: S[H].display
+ }), N = N.slice(M + S[H].right.length);
+ }
+ return N !== "" && L.push({
+ type: "text",
+ data: N
+ }), L;
+ };
+ const K = function(N, S) {
+ const M = U(N, S.delimiters);
+ if (M.length === 1 && M[0].type === "text")
+ return null;
+ const L = document.createDocumentFragment();
+ for (let z = 0; z < M.length; z++)
+ if (M[z].type === "text")
+ L.appendChild(document.createTextNode(M[z].data));
+ else {
+ const H = document.createElement("span");
+ let te = M[z].data;
+ S.displayMode = M[z].display;
+ try {
+ S.preProcess && (te = S.preProcess(te)), g().render(te, H, S);
+ } catch (Q) {
+ if (!(Q instanceof g().ParseError))
+ throw Q;
+ S.errorCallback("KaTeX auto-render: Failed to parse `" + M[z].data + "` with ", Q), L.appendChild(document.createTextNode(M[z].rawData));
+ continue;
+ }
+ L.appendChild(H);
+ }
+ return L;
+ }, ee = function(N, S) {
+ for (let M = 0; M < N.childNodes.length; M++) {
+ const L = N.childNodes[M];
+ if (L.nodeType === 3) {
+ let z = L.textContent, H = L.nextSibling, te = 0;
+ for (; H && H.nodeType === Node.TEXT_NODE; )
+ z += H.textContent, H = H.nextSibling, te++;
+ const Q = K(z, S);
+ if (Q) {
+ for (let ce = 0; ce < te; ce++)
+ L.nextSibling.remove();
+ M += Q.childNodes.length - 1, N.replaceChild(Q, L);
+ } else
+ M += te;
+ } else if (L.nodeType === 1) {
+ const z = " " + L.className + " ";
+ S.ignoredTags.indexOf(L.nodeName.toLowerCase()) === -1 && S.ignoredClasses.every((te) => z.indexOf(" " + te + " ") === -1) && ee(L, S);
+ }
+ }
+ };
+ var R = function(N, S) {
+ if (!N)
+ throw new Error("No element provided to render");
+ const M = {};
+ for (const L in S)
+ S.hasOwnProperty(L) && (M[L] = S[L]);
+ M.delimiters = M.delimiters || [
+ {
+ left: "$$",
+ right: "$$",
+ display: !0
+ },
+ {
+ left: "\\(",
+ right: "\\)",
+ display: !1
+ },
+ // LaTeX uses $…$, but it ruins the display of normal `$` in text:
+ // {left: "$", right: "$", display: false},
+ // $ must come after $$
+ // Render AMS environments even if outside $$…$$ delimiters.
+ {
+ left: "\\begin{equation}",
+ right: "\\end{equation}",
+ display: !0
+ },
+ {
+ left: "\\begin{align}",
+ right: "\\end{align}",
+ display: !0
+ },
+ {
+ left: "\\begin{alignat}",
+ right: "\\end{alignat}",
+ display: !0
+ },
+ {
+ left: "\\begin{gather}",
+ right: "\\end{gather}",
+ display: !0
+ },
+ {
+ left: "\\begin{CD}",
+ right: "\\end{CD}",
+ display: !0
+ },
+ {
+ left: "\\[",
+ right: "\\]",
+ display: !0
+ }
+ ], M.ignoredTags = M.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code", "option"], M.ignoredClasses = M.ignoredClasses || [], M.errorCallback = M.errorCallback || console.error, M.macros = M.macros || {}, ee(N, M);
+ };
+ }(), f = f.default, f;
+ }()
+ );
+ });
+})(wo);
+var X4 = wo.exports;
+const Y4 = /* @__PURE__ */ bo(X4);
+function Hs() {
+ return {
+ async: !1,
+ breaks: !1,
+ extensions: null,
+ gfm: !0,
+ hooks: null,
+ pedantic: !1,
+ renderer: null,
+ silent: !1,
+ tokenizer: null,
+ walkTokens: null
+ };
+}
+let j0 = Hs();
+function yo(a) {
+ j0 = a;
+}
+const _o = /[&<>"']/, Z4 = new RegExp(_o.source, "g"), ko = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, K4 = new RegExp(ko.source, "g"), Q4 = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'"
+}, Hl = (a) => Q4[a];
+function kt(a, r) {
+ if (r) {
+ if (_o.test(a))
+ return a.replace(Z4, Hl);
+ } else if (ko.test(a))
+ return a.replace(K4, Hl);
+ return a;
+}
+const J4 = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
+function $4(a) {
+ return a.replace(J4, (r, s) => (s = s.toLowerCase(), s === "colon" ? ":" : s.charAt(0) === "#" ? s.charAt(1) === "x" ? String.fromCharCode(parseInt(s.substring(2), 16)) : String.fromCharCode(+s.substring(1)) : ""));
+}
+const eh = /(^|[^\[])\^/g;
+function ze(a, r) {
+ let s = typeof a == "string" ? a : a.source;
+ r = r || "";
+ const i = {
+ replace: (o, u) => {
+ let f = typeof u == "string" ? u : u.source;
+ return f = f.replace(eh, "$1"), s = s.replace(o, f), i;
+ },
+ getRegex: () => new RegExp(s, r)
+ };
+ return i;
+}
+function Ul(a) {
+ try {
+ a = encodeURI(a).replace(/%25/g, "%");
+ } catch {
+ return null;
+ }
+ return a;
+}
+const Tn = { exec: () => null };
+function Gl(a, r) {
+ const s = a.replace(/\|/g, (u, f, p) => {
+ let g = !1, y = f;
+ for (; --y >= 0 && p[y] === "\\"; )
+ g = !g;
+ return g ? "|" : " |";
+ }), i = s.split(/ \|/);
+ let o = 0;
+ if (i[0].trim() || i.shift(), i.length > 0 && !i[i.length - 1].trim() && i.pop(), r)
+ if (i.length > r)
+ i.splice(r);
+ else
+ for (; i.length < r; )
+ i.push("");
+ for (; o < i.length; o++)
+ i[o] = i[o].trim().replace(/\\\|/g, "|");
+ return i;
+}
+function cr(a, r, s) {
+ const i = a.length;
+ if (i === 0)
+ return "";
+ let o = 0;
+ for (; o < i; ) {
+ const u = a.charAt(i - o - 1);
+ if (u === r && !s)
+ o++;
+ else if (u !== r && s)
+ o++;
+ else
+ break;
+ }
+ return a.slice(0, i - o);
+}
+function th(a, r) {
+ if (a.indexOf(r[1]) === -1)
+ return -1;
+ let s = 0;
+ for (let i = 0; i < a.length; i++)
+ if (a[i] === "\\")
+ i++;
+ else if (a[i] === r[0])
+ s++;
+ else if (a[i] === r[1] && (s--, s < 0))
+ return i;
+ return -1;
+}
+function Vl(a, r, s, i) {
+ const o = r.href, u = r.title ? kt(r.title) : null, f = a[1].replace(/\\([\[\]])/g, "$1");
+ if (a[0].charAt(0) !== "!") {
+ i.state.inLink = !0;
+ const p = {
+ type: "link",
+ raw: s,
+ href: o,
+ title: u,
+ text: f,
+ tokens: i.inlineTokens(f)
+ };
+ return i.state.inLink = !1, p;
+ }
+ return {
+ type: "image",
+ raw: s,
+ href: o,
+ title: u,
+ text: kt(f)
+ };
+}
+function nh(a, r) {
+ const s = a.match(/^(\s+)(?:```)/);
+ if (s === null)
+ return r;
+ const i = s[1];
+ return r.split(`
+`).map((o) => {
+ const u = o.match(/^\s+/);
+ if (u === null)
+ return o;
+ const [f] = u;
+ return f.length >= i.length ? o.slice(i.length) : o;
+ }).join(`
+`);
+}
+class _r {
+ // set by the lexer
+ constructor(r) {
+ Ue(this, "options");
+ Ue(this, "rules");
+ // set by the lexer
+ Ue(this, "lexer");
+ this.options = r || j0;
+ }
+ space(r) {
+ const s = this.rules.block.newline.exec(r);
+ if (s && s[0].length > 0)
+ return {
+ type: "space",
+ raw: s[0]
+ };
+ }
+ code(r) {
+ const s = this.rules.block.code.exec(r);
+ if (s) {
+ const i = s[0].replace(/^ {1,4}/gm, "");
+ return {
+ type: "code",
+ raw: s[0],
+ codeBlockStyle: "indented",
+ text: this.options.pedantic ? i : cr(i, `
+`)
+ };
+ }
+ }
+ fences(r) {
+ const s = this.rules.block.fences.exec(r);
+ if (s) {
+ const i = s[0], o = nh(i, s[3] || "");
+ return {
+ type: "code",
+ raw: i,
+ lang: s[2] ? s[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : s[2],
+ text: o
+ };
+ }
+ }
+ heading(r) {
+ const s = this.rules.block.heading.exec(r);
+ if (s) {
+ let i = s[2].trim();
+ if (/#$/.test(i)) {
+ const o = cr(i, "#");
+ (this.options.pedantic || !o || / $/.test(o)) && (i = o.trim());
+ }
+ return {
+ type: "heading",
+ raw: s[0],
+ depth: s[1].length,
+ text: i,
+ tokens: this.lexer.inline(i)
+ };
+ }
+ }
+ hr(r) {
+ const s = this.rules.block.hr.exec(r);
+ if (s)
+ return {
+ type: "hr",
+ raw: s[0]
+ };
+ }
+ blockquote(r) {
+ const s = this.rules.block.blockquote.exec(r);
+ if (s) {
+ const i = cr(s[0].replace(/^ *>[ \t]?/gm, ""), `
+`), o = this.lexer.state.top;
+ this.lexer.state.top = !0;
+ const u = this.lexer.blockTokens(i);
+ return this.lexer.state.top = o, {
+ type: "blockquote",
+ raw: s[0],
+ tokens: u,
+ text: i
+ };
+ }
+ }
+ list(r) {
+ let s = this.rules.block.list.exec(r);
+ if (s) {
+ let i = s[1].trim();
+ const o = i.length > 1, u = {
+ type: "list",
+ raw: "",
+ ordered: o,
+ start: o ? +i.slice(0, -1) : "",
+ loose: !1,
+ items: []
+ };
+ i = o ? `\\d{1,9}\\${i.slice(-1)}` : `\\${i}`, this.options.pedantic && (i = o ? i : "[*+-]");
+ const f = new RegExp(`^( {0,3}${i})((?:[ ][^\\n]*)?(?:\\n|$))`);
+ let p = "", g = "", y = !1;
+ for (; r; ) {
+ let D = !1;
+ if (!(s = f.exec(r)) || this.rules.block.hr.test(r))
+ break;
+ p = s[0], r = r.substring(p.length);
+ let T = s[2].split(`
+`, 1)[0].replace(/^\t+/, (R) => " ".repeat(3 * R.length)), P = r.split(`
+`, 1)[0], U = 0;
+ this.options.pedantic ? (U = 2, g = T.trimStart()) : (U = s[2].search(/[^ ]/), U = U > 4 ? 1 : U, g = T.slice(U), U += s[1].length);
+ let K = !1;
+ if (!T && /^ *$/.test(P) && (p += P + `
+`, r = r.substring(P.length + 1), D = !0), !D) {
+ const R = new RegExp(`^ {0,${Math.min(3, U - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), N = new RegExp(`^ {0,${Math.min(3, U - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), S = new RegExp(`^ {0,${Math.min(3, U - 1)}}(?:\`\`\`|~~~)`), M = new RegExp(`^ {0,${Math.min(3, U - 1)}}#`);
+ for (; r; ) {
+ const L = r.split(`
+`, 1)[0];
+ if (P = L, this.options.pedantic && (P = P.replace(/^ {1,4}(?=( {4})*[^ ])/g, " ")), S.test(P) || M.test(P) || R.test(P) || N.test(r))
+ break;
+ if (P.search(/[^ ]/) >= U || !P.trim())
+ g += `
+` + P.slice(U);
+ else {
+ if (K || T.search(/[^ ]/) >= 4 || S.test(T) || M.test(T) || N.test(T))
+ break;
+ g += `
+` + P;
+ }
+ !K && !P.trim() && (K = !0), p += L + `
+`, r = r.substring(L.length + 1), T = P.slice(U);
+ }
+ }
+ u.loose || (y ? u.loose = !0 : /\n *\n *$/.test(p) && (y = !0));
+ let ee = null, Z;
+ this.options.gfm && (ee = /^\[[ xX]\] /.exec(g), ee && (Z = ee[0] !== "[ ] ", g = g.replace(/^\[[ xX]\] +/, ""))), u.items.push({
+ type: "list_item",
+ raw: p,
+ task: !!ee,
+ checked: Z,
+ loose: !1,
+ text: g,
+ tokens: []
+ }), u.raw += p;
+ }
+ u.items[u.items.length - 1].raw = p.trimEnd(), u.items[u.items.length - 1].text = g.trimEnd(), u.raw = u.raw.trimEnd();
+ for (let D = 0; D < u.items.length; D++)
+ if (this.lexer.state.top = !1, u.items[D].tokens = this.lexer.blockTokens(u.items[D].text, []), !u.loose) {
+ const T = u.items[D].tokens.filter((U) => U.type === "space"), P = T.length > 0 && T.some((U) => /\n.*\n/.test(U.raw));
+ u.loose = P;
+ }
+ if (u.loose)
+ for (let D = 0; D < u.items.length; D++)
+ u.items[D].loose = !0;
+ return u;
+ }
+ }
+ html(r) {
+ const s = this.rules.block.html.exec(r);
+ if (s)
+ return {
+ type: "html",
+ block: !0,
+ raw: s[0],
+ pre: s[1] === "pre" || s[1] === "script" || s[1] === "style",
+ text: s[0]
+ };
+ }
+ def(r) {
+ const s = this.rules.block.def.exec(r);
+ if (s) {
+ const i = s[1].toLowerCase().replace(/\s+/g, " "), o = s[2] ? s[2].replace(/^<(.*)>$/, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", u = s[3] ? s[3].substring(1, s[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : s[3];
+ return {
+ type: "def",
+ tag: i,
+ raw: s[0],
+ href: o,
+ title: u
+ };
+ }
+ }
+ table(r) {
+ const s = this.rules.block.table.exec(r);
+ if (!s || !/[:|]/.test(s[2]))
+ return;
+ const i = Gl(s[1]), o = s[2].replace(/^\||\| *$/g, "").split("|"), u = s[3] && s[3].trim() ? s[3].replace(/\n[ \t]*$/, "").split(`
+`) : [], f = {
+ type: "table",
+ raw: s[0],
+ header: [],
+ align: [],
+ rows: []
+ };
+ if (i.length === o.length) {
+ for (const p of o)
+ /^ *-+: *$/.test(p) ? f.align.push("right") : /^ *:-+: *$/.test(p) ? f.align.push("center") : /^ *:-+ *$/.test(p) ? f.align.push("left") : f.align.push(null);
+ for (const p of i)
+ f.header.push({
+ text: p,
+ tokens: this.lexer.inline(p)
+ });
+ for (const p of u)
+ f.rows.push(Gl(p, f.header.length).map((g) => ({
+ text: g,
+ tokens: this.lexer.inline(g)
+ })));
+ return f;
+ }
+ }
+ lheading(r) {
+ const s = this.rules.block.lheading.exec(r);
+ if (s)
+ return {
+ type: "heading",
+ raw: s[0],
+ depth: s[2].charAt(0) === "=" ? 1 : 2,
+ text: s[1],
+ tokens: this.lexer.inline(s[1])
+ };
+ }
+ paragraph(r) {
+ const s = this.rules.block.paragraph.exec(r);
+ if (s) {
+ const i = s[1].charAt(s[1].length - 1) === `
+` ? s[1].slice(0, -1) : s[1];
+ return {
+ type: "paragraph",
+ raw: s[0],
+ text: i,
+ tokens: this.lexer.inline(i)
+ };
+ }
+ }
+ text(r) {
+ const s = this.rules.block.text.exec(r);
+ if (s)
+ return {
+ type: "text",
+ raw: s[0],
+ text: s[0],
+ tokens: this.lexer.inline(s[0])
+ };
+ }
+ escape(r) {
+ const s = this.rules.inline.escape.exec(r);
+ if (s)
+ return {
+ type: "escape",
+ raw: s[0],
+ text: kt(s[1])
+ };
+ }
+ tag(r) {
+ const s = this.rules.inline.tag.exec(r);
+ if (s)
+ return !this.lexer.state.inLink && /^/i.test(s[0]) && (this.lexer.state.inLink = !1), !this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(s[0]) ? this.lexer.state.inRawBlock = !0 : this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(s[0]) && (this.lexer.state.inRawBlock = !1), {
+ type: "html",
+ raw: s[0],
+ inLink: this.lexer.state.inLink,
+ inRawBlock: this.lexer.state.inRawBlock,
+ block: !1,
+ text: s[0]
+ };
+ }
+ link(r) {
+ const s = this.rules.inline.link.exec(r);
+ if (s) {
+ const i = s[2].trim();
+ if (!this.options.pedantic && /^$/.test(i))
+ return;
+ const f = cr(i.slice(0, -1), "\\");
+ if ((i.length - f.length) % 2 === 0)
+ return;
+ } else {
+ const f = th(s[2], "()");
+ if (f > -1) {
+ const g = (s[0].indexOf("!") === 0 ? 5 : 4) + s[1].length + f;
+ s[2] = s[2].substring(0, f), s[0] = s[0].substring(0, g).trim(), s[3] = "";
+ }
+ }
+ let o = s[2], u = "";
+ if (this.options.pedantic) {
+ const f = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(o);
+ f && (o = f[1], u = f[3]);
+ } else
+ u = s[3] ? s[3].slice(1, -1) : "";
+ return o = o.trim(), /^$/.test(i) ? o = o.slice(1) : o = o.slice(1, -1)), Vl(s, {
+ href: o && o.replace(this.rules.inline.anyPunctuation, "$1"),
+ title: u && u.replace(this.rules.inline.anyPunctuation, "$1")
+ }, s[0], this.lexer);
+ }
+ }
+ reflink(r, s) {
+ let i;
+ if ((i = this.rules.inline.reflink.exec(r)) || (i = this.rules.inline.nolink.exec(r))) {
+ const o = (i[2] || i[1]).replace(/\s+/g, " "), u = s[o.toLowerCase()];
+ if (!u) {
+ const f = i[0].charAt(0);
+ return {
+ type: "text",
+ raw: f,
+ text: f
+ };
+ }
+ return Vl(i, u, i[0], this.lexer);
+ }
+ }
+ emStrong(r, s, i = "") {
+ let o = this.rules.inline.emStrongLDelim.exec(r);
+ if (!o || o[3] && i.match(/[\p{L}\p{N}]/u))
+ return;
+ if (!(o[1] || o[2] || "") || !i || this.rules.inline.punctuation.exec(i)) {
+ const f = [...o[0]].length - 1;
+ let p, g, y = f, D = 0;
+ const T = o[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
+ for (T.lastIndex = 0, s = s.slice(-1 * r.length + f); (o = T.exec(s)) != null; ) {
+ if (p = o[1] || o[2] || o[3] || o[4] || o[5] || o[6], !p)
+ continue;
+ if (g = [...p].length, o[3] || o[4]) {
+ y += g;
+ continue;
+ } else if ((o[5] || o[6]) && f % 3 && !((f + g) % 3)) {
+ D += g;
+ continue;
+ }
+ if (y -= g, y > 0)
+ continue;
+ g = Math.min(g, g + y + D);
+ const P = [...o[0]][0].length, U = r.slice(0, f + o.index + P + g);
+ if (Math.min(f, g) % 2) {
+ const ee = U.slice(1, -1);
+ return {
+ type: "em",
+ raw: U,
+ text: ee,
+ tokens: this.lexer.inlineTokens(ee)
+ };
+ }
+ const K = U.slice(2, -2);
+ return {
+ type: "strong",
+ raw: U,
+ text: K,
+ tokens: this.lexer.inlineTokens(K)
+ };
+ }
+ }
+ }
+ codespan(r) {
+ const s = this.rules.inline.code.exec(r);
+ if (s) {
+ let i = s[2].replace(/\n/g, " ");
+ const o = /[^ ]/.test(i), u = /^ /.test(i) && / $/.test(i);
+ return o && u && (i = i.substring(1, i.length - 1)), i = kt(i, !0), {
+ type: "codespan",
+ raw: s[0],
+ text: i
+ };
+ }
+ }
+ br(r) {
+ const s = this.rules.inline.br.exec(r);
+ if (s)
+ return {
+ type: "br",
+ raw: s[0]
+ };
+ }
+ del(r) {
+ const s = this.rules.inline.del.exec(r);
+ if (s)
+ return {
+ type: "del",
+ raw: s[0],
+ text: s[2],
+ tokens: this.lexer.inlineTokens(s[2])
+ };
+ }
+ autolink(r) {
+ const s = this.rules.inline.autolink.exec(r);
+ if (s) {
+ let i, o;
+ return s[2] === "@" ? (i = kt(s[1]), o = "mailto:" + i) : (i = kt(s[1]), o = i), {
+ type: "link",
+ raw: s[0],
+ text: i,
+ href: o,
+ tokens: [
+ {
+ type: "text",
+ raw: i,
+ text: i
+ }
+ ]
+ };
+ }
+ }
+ url(r) {
+ var i;
+ let s;
+ if (s = this.rules.inline.url.exec(r)) {
+ let o, u;
+ if (s[2] === "@")
+ o = kt(s[0]), u = "mailto:" + o;
+ else {
+ let f;
+ do
+ f = s[0], s[0] = ((i = this.rules.inline._backpedal.exec(s[0])) == null ? void 0 : i[0]) ?? "";
+ while (f !== s[0]);
+ o = kt(s[0]), s[1] === "www." ? u = "http://" + s[0] : u = s[0];
+ }
+ return {
+ type: "link",
+ raw: s[0],
+ text: o,
+ href: u,
+ tokens: [
+ {
+ type: "text",
+ raw: o,
+ text: o
+ }
+ ]
+ };
+ }
+ }
+ inlineText(r) {
+ const s = this.rules.inline.text.exec(r);
+ if (s) {
+ let i;
+ return this.lexer.state.inRawBlock ? i = s[0] : i = kt(s[0]), {
+ type: "text",
+ raw: s[0],
+ text: i
+ };
+ }
+ }
+}
+const rh = /^(?: *(?:\n|$))+/, sh = /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, ih = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, Bn = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, lh = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, xo = /(?:[*+-]|\d{1,9}[.)])/, Do = ze(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g, xo).replace(/blockCode/g, / {4}/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).getRegex(), Us = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, ah = /^[^\n]+/, Gs = /(?!\s*\])(?:\\.|[^\[\]\\])+/, oh = ze(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label", Gs).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), uh = ze(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, xo).getRegex(), Ar = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", Vs = /|$))/, ch = ze("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))", "i").replace("comment", Vs).replace("tag", Ar).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), vo = ze(Us).replace("hr", Bn).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", Ar).getRegex(), hh = ze(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", vo).getRegex(), Ws = {
+ blockquote: hh,
+ code: sh,
+ def: oh,
+ fences: ih,
+ heading: lh,
+ hr: Bn,
+ html: ch,
+ lheading: Do,
+ list: uh,
+ newline: rh,
+ paragraph: vo,
+ table: Tn,
+ text: ah
+}, Wl = ze("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", Bn).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", Ar).getRegex(), fh = {
+ ...Ws,
+ table: Wl,
+ paragraph: ze(Us).replace("hr", Bn).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", Wl).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", Ar).getRegex()
+}, dh = {
+ ...Ws,
+ html: ze(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)| \\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", Vs).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),
+ def: /^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
+ heading: /^(#{1,6})(.*)(?:\n+|$)/,
+ fences: Tn,
+ // fences not supported
+ lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
+ paragraph: ze(Us).replace("hr", Bn).replace("heading", ` *#{1,6} *[^
+]`).replace("lheading", Do).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex()
+}, Ao = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, mh = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, So = /^( {2,}|\\)\n(?!\s*$)/, ph = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g, wh = ze(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/, "u").replace(/punct/g, Nn).getRegex(), yh = ze("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])", "gu").replace(/punct/g, Nn).getRegex(), _h = ze("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])", "gu").replace(/punct/g, Nn).getRegex(), kh = ze(/\\([punct])/, "gu").replace(/punct/g, Nn).getRegex(), xh = ze(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), Dh = ze(Vs).replace("(?:-->|$)", "-->").getRegex(), vh = ze("^comment|^[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", Dh).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), kr = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/, Ah = ze(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label", kr).replace("href", /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), Fo = ze(/^!?\[(label)\]\[(ref)\]/).replace("label", kr).replace("ref", Gs).getRegex(), Eo = ze(/^!?\[(ref)\](?:\[\])?/).replace("ref", Gs).getRegex(), Sh = ze("reflink|nolink(?!\\()", "g").replace("reflink", Fo).replace("nolink", Eo).getRegex(), js = {
+ _backpedal: Tn,
+ // only used for GFM url
+ anyPunctuation: kh,
+ autolink: xh,
+ blockSkip: bh,
+ br: So,
+ code: mh,
+ del: Tn,
+ emStrongLDelim: wh,
+ emStrongRDelimAst: yh,
+ emStrongRDelimUnd: _h,
+ escape: Ao,
+ link: Ah,
+ nolink: Eo,
+ punctuation: gh,
+ reflink: Fo,
+ reflinkSearch: Sh,
+ tag: vh,
+ text: ph,
+ url: Tn
+}, Fh = {
+ ...js,
+ link: ze(/^!?\[(label)\]\((.*?)\)/).replace("label", kr).getRegex(),
+ reflink: ze(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", kr).getRegex()
+}, Ls = {
+ ...js,
+ escape: ze(Ao).replace("])", "~|])").getRegex(),
+ url: ze(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, "i").replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),
+ _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
+ del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
+ text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\ g + " ".repeat(y.length));
+ let i, o, u, f;
+ for (; r; )
+ if (!(this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((p) => (i = p.call({ lexer: this }, r, s)) ? (r = r.substring(i.raw.length), s.push(i), !0) : !1))) {
+ if (i = this.tokenizer.space(r)) {
+ r = r.substring(i.raw.length), i.raw.length === 1 && s.length > 0 ? s[s.length - 1].raw += `
+` : s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.code(r)) {
+ r = r.substring(i.raw.length), o = s[s.length - 1], o && (o.type === "paragraph" || o.type === "text") ? (o.raw += `
+` + i.raw, o.text += `
+` + i.text, this.inlineQueue[this.inlineQueue.length - 1].src = o.text) : s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.fences(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.heading(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.hr(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.blockquote(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.list(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.html(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.def(r)) {
+ r = r.substring(i.raw.length), o = s[s.length - 1], o && (o.type === "paragraph" || o.type === "text") ? (o.raw += `
+` + i.raw, o.text += `
+` + i.raw, this.inlineQueue[this.inlineQueue.length - 1].src = o.text) : this.tokens.links[i.tag] || (this.tokens.links[i.tag] = {
+ href: i.href,
+ title: i.title
+ });
+ continue;
+ }
+ if (i = this.tokenizer.table(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.lheading(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (u = r, this.options.extensions && this.options.extensions.startBlock) {
+ let p = 1 / 0;
+ const g = r.slice(1);
+ let y;
+ this.options.extensions.startBlock.forEach((D) => {
+ y = D.call({ lexer: this }, g), typeof y == "number" && y >= 0 && (p = Math.min(p, y));
+ }), p < 1 / 0 && p >= 0 && (u = r.substring(0, p + 1));
+ }
+ if (this.state.top && (i = this.tokenizer.paragraph(u))) {
+ o = s[s.length - 1], f && o.type === "paragraph" ? (o.raw += `
+` + i.raw, o.text += `
+` + i.text, this.inlineQueue.pop(), this.inlineQueue[this.inlineQueue.length - 1].src = o.text) : s.push(i), f = u.length !== r.length, r = r.substring(i.raw.length);
+ continue;
+ }
+ if (i = this.tokenizer.text(r)) {
+ r = r.substring(i.raw.length), o = s[s.length - 1], o && o.type === "text" ? (o.raw += `
+` + i.raw, o.text += `
+` + i.text, this.inlineQueue.pop(), this.inlineQueue[this.inlineQueue.length - 1].src = o.text) : s.push(i);
+ continue;
+ }
+ if (r) {
+ const p = "Infinite loop on byte: " + r.charCodeAt(0);
+ if (this.options.silent) {
+ console.error(p);
+ break;
+ } else
+ throw new Error(p);
+ }
+ }
+ return this.state.top = !0, s;
+ }
+ inline(r, s = []) {
+ return this.inlineQueue.push({ src: r, tokens: s }), s;
+ }
+ /**
+ * Lexing/Compiling
+ */
+ inlineTokens(r, s = []) {
+ let i, o, u, f = r, p, g, y;
+ if (this.tokens.links) {
+ const D = Object.keys(this.tokens.links);
+ if (D.length > 0)
+ for (; (p = this.tokenizer.rules.inline.reflinkSearch.exec(f)) != null; )
+ D.includes(p[0].slice(p[0].lastIndexOf("[") + 1, -1)) && (f = f.slice(0, p.index) + "[" + "a".repeat(p[0].length - 2) + "]" + f.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex));
+ }
+ for (; (p = this.tokenizer.rules.inline.blockSkip.exec(f)) != null; )
+ f = f.slice(0, p.index) + "[" + "a".repeat(p[0].length - 2) + "]" + f.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
+ for (; (p = this.tokenizer.rules.inline.anyPunctuation.exec(f)) != null; )
+ f = f.slice(0, p.index) + "++" + f.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
+ for (; r; )
+ if (g || (y = ""), g = !1, !(this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((D) => (i = D.call({ lexer: this }, r, s)) ? (r = r.substring(i.raw.length), s.push(i), !0) : !1))) {
+ if (i = this.tokenizer.escape(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.tag(r)) {
+ r = r.substring(i.raw.length), o = s[s.length - 1], o && i.type === "text" && o.type === "text" ? (o.raw += i.raw, o.text += i.text) : s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.link(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.reflink(r, this.tokens.links)) {
+ r = r.substring(i.raw.length), o = s[s.length - 1], o && i.type === "text" && o.type === "text" ? (o.raw += i.raw, o.text += i.text) : s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.emStrong(r, f, y)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.codespan(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.br(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.del(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (i = this.tokenizer.autolink(r)) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (!this.state.inLink && (i = this.tokenizer.url(r))) {
+ r = r.substring(i.raw.length), s.push(i);
+ continue;
+ }
+ if (u = r, this.options.extensions && this.options.extensions.startInline) {
+ let D = 1 / 0;
+ const T = r.slice(1);
+ let P;
+ this.options.extensions.startInline.forEach((U) => {
+ P = U.call({ lexer: this }, T), typeof P == "number" && P >= 0 && (D = Math.min(D, P));
+ }), D < 1 / 0 && D >= 0 && (u = r.substring(0, D + 1));
+ }
+ if (i = this.tokenizer.inlineText(u)) {
+ r = r.substring(i.raw.length), i.raw.slice(-1) !== "_" && (y = i.raw.slice(-1)), g = !0, o = s[s.length - 1], o && o.type === "text" ? (o.raw += i.raw, o.text += i.text) : s.push(i);
+ continue;
+ }
+ if (r) {
+ const D = "Infinite loop on byte: " + r.charCodeAt(0);
+ if (this.options.silent) {
+ console.error(D);
+ break;
+ } else
+ throw new Error(D);
+ }
+ }
+ return s;
+ }
+}
+class xr {
+ constructor(r) {
+ Ue(this, "options");
+ this.options = r || j0;
+ }
+ code(r, s, i) {
+ var u;
+ const o = (u = (s || "").match(/^\S*/)) == null ? void 0 : u[0];
+ return r = r.replace(/\n$/, "") + `
+`, o ? '' + (i ? r : kt(r, !0)) + `
+` : "" + (i ? r : kt(r, !0)) + `
+`;
+ }
+ blockquote(r) {
+ return `
+${r}
+`;
+ }
+ html(r, s) {
+ return r;
+ }
+ heading(r, s, i) {
+ return `${r}
+`;
+ }
+ hr() {
+ return `
+`;
+ }
+ list(r, s, i) {
+ const o = s ? "ol" : "ul", u = s && i !== 1 ? ' start="' + i + '"' : "";
+ return "<" + o + u + `>
+` + r + "" + o + `>
+`;
+ }
+ listitem(r, s, i) {
+ return `${r}
+`;
+ }
+ checkbox(r) {
+ return " ';
+ }
+ paragraph(r) {
+ return `${r}
+`;
+ }
+ table(r, s) {
+ return s && (s = `${s} `), `
+`;
+ }
+ tablerow(r) {
+ return `
+${r}
+`;
+ }
+ tablecell(r, s) {
+ const i = s.header ? "th" : "td";
+ return (s.align ? `<${i} align="${s.align}">` : `<${i}>`) + r + `${i}>
+`;
+ }
+ /**
+ * span level renderer
+ */
+ strong(r) {
+ return `${r} `;
+ }
+ em(r) {
+ return `${r} `;
+ }
+ codespan(r) {
+ return `${r}
`;
+ }
+ br() {
+ return " ";
+ }
+ del(r) {
+ return `${r}`;
+ }
+ link(r, s, i) {
+ const o = Ul(r);
+ if (o === null)
+ return i;
+ r = o;
+ let u = '" + i + " ", u;
+ }
+ image(r, s, i) {
+ const o = Ul(r);
+ if (o === null)
+ return i;
+ r = o;
+ let u = ` ", u;
+ }
+ text(r) {
+ return r;
+ }
+}
+class Xs {
+ // no need for block level renderers
+ strong(r) {
+ return r;
+ }
+ em(r) {
+ return r;
+ }
+ codespan(r) {
+ return r;
+ }
+ del(r) {
+ return r;
+ }
+ html(r) {
+ return r;
+ }
+ text(r) {
+ return r;
+ }
+ link(r, s, i) {
+ return "" + i;
+ }
+ image(r, s, i) {
+ return "" + i;
+ }
+ br() {
+ return "";
+ }
+}
+class r0 {
+ constructor(r) {
+ Ue(this, "options");
+ Ue(this, "renderer");
+ Ue(this, "textRenderer");
+ this.options = r || j0, this.options.renderer = this.options.renderer || new xr(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.textRenderer = new Xs();
+ }
+ /**
+ * Static Parse Method
+ */
+ static parse(r, s) {
+ return new r0(s).parse(r);
+ }
+ /**
+ * Static Parse Inline Method
+ */
+ static parseInline(r, s) {
+ return new r0(s).parseInline(r);
+ }
+ /**
+ * Parse Loop
+ */
+ parse(r, s = !0) {
+ let i = "";
+ for (let o = 0; o < r.length; o++) {
+ const u = r[o];
+ if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[u.type]) {
+ const f = u, p = this.options.extensions.renderers[f.type].call({ parser: this }, f);
+ if (p !== !1 || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(f.type)) {
+ i += p || "";
+ continue;
+ }
+ }
+ switch (u.type) {
+ case "space":
+ continue;
+ case "hr": {
+ i += this.renderer.hr();
+ continue;
+ }
+ case "heading": {
+ const f = u;
+ i += this.renderer.heading(this.parseInline(f.tokens), f.depth, $4(this.parseInline(f.tokens, this.textRenderer)));
+ continue;
+ }
+ case "code": {
+ const f = u;
+ i += this.renderer.code(f.text, f.lang, !!f.escaped);
+ continue;
+ }
+ case "table": {
+ const f = u;
+ let p = "", g = "";
+ for (let D = 0; D < f.header.length; D++)
+ g += this.renderer.tablecell(this.parseInline(f.header[D].tokens), { header: !0, align: f.align[D] });
+ p += this.renderer.tablerow(g);
+ let y = "";
+ for (let D = 0; D < f.rows.length; D++) {
+ const T = f.rows[D];
+ g = "";
+ for (let P = 0; P < T.length; P++)
+ g += this.renderer.tablecell(this.parseInline(T[P].tokens), { header: !1, align: f.align[P] });
+ y += this.renderer.tablerow(g);
+ }
+ i += this.renderer.table(p, y);
+ continue;
+ }
+ case "blockquote": {
+ const f = u, p = this.parse(f.tokens);
+ i += this.renderer.blockquote(p);
+ continue;
+ }
+ case "list": {
+ const f = u, p = f.ordered, g = f.start, y = f.loose;
+ let D = "";
+ for (let T = 0; T < f.items.length; T++) {
+ const P = f.items[T], U = P.checked, K = P.task;
+ let ee = "";
+ if (P.task) {
+ const Z = this.renderer.checkbox(!!U);
+ y ? P.tokens.length > 0 && P.tokens[0].type === "paragraph" ? (P.tokens[0].text = Z + " " + P.tokens[0].text, P.tokens[0].tokens && P.tokens[0].tokens.length > 0 && P.tokens[0].tokens[0].type === "text" && (P.tokens[0].tokens[0].text = Z + " " + P.tokens[0].tokens[0].text)) : P.tokens.unshift({
+ type: "text",
+ text: Z + " "
+ }) : ee += Z + " ";
+ }
+ ee += this.parse(P.tokens, y), D += this.renderer.listitem(ee, K, !!U);
+ }
+ i += this.renderer.list(D, p, g);
+ continue;
+ }
+ case "html": {
+ const f = u;
+ i += this.renderer.html(f.text, f.block);
+ continue;
+ }
+ case "paragraph": {
+ const f = u;
+ i += this.renderer.paragraph(this.parseInline(f.tokens));
+ continue;
+ }
+ case "text": {
+ let f = u, p = f.tokens ? this.parseInline(f.tokens) : f.text;
+ for (; o + 1 < r.length && r[o + 1].type === "text"; )
+ f = r[++o], p += `
+` + (f.tokens ? this.parseInline(f.tokens) : f.text);
+ i += s ? this.renderer.paragraph(p) : p;
+ continue;
+ }
+ default: {
+ const f = 'Token with "' + u.type + '" type was not found.';
+ if (this.options.silent)
+ return console.error(f), "";
+ throw new Error(f);
+ }
+ }
+ }
+ return i;
+ }
+ /**
+ * Parse Inline Tokens
+ */
+ parseInline(r, s) {
+ s = s || this.renderer;
+ let i = "";
+ for (let o = 0; o < r.length; o++) {
+ const u = r[o];
+ if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[u.type]) {
+ const f = this.options.extensions.renderers[u.type].call({ parser: this }, u);
+ if (f !== !1 || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(u.type)) {
+ i += f || "";
+ continue;
+ }
+ }
+ switch (u.type) {
+ case "escape": {
+ const f = u;
+ i += s.text(f.text);
+ break;
+ }
+ case "html": {
+ const f = u;
+ i += s.html(f.text);
+ break;
+ }
+ case "link": {
+ const f = u;
+ i += s.link(f.href, f.title, this.parseInline(f.tokens, s));
+ break;
+ }
+ case "image": {
+ const f = u;
+ i += s.image(f.href, f.title, f.text);
+ break;
+ }
+ case "strong": {
+ const f = u;
+ i += s.strong(this.parseInline(f.tokens, s));
+ break;
+ }
+ case "em": {
+ const f = u;
+ i += s.em(this.parseInline(f.tokens, s));
+ break;
+ }
+ case "codespan": {
+ const f = u;
+ i += s.codespan(f.text);
+ break;
+ }
+ case "br": {
+ i += s.br();
+ break;
+ }
+ case "del": {
+ const f = u;
+ i += s.del(this.parseInline(f.tokens, s));
+ break;
+ }
+ case "text": {
+ const f = u;
+ i += s.text(f.text);
+ break;
+ }
+ default: {
+ const f = 'Token with "' + u.type + '" type was not found.';
+ if (this.options.silent)
+ return console.error(f), "";
+ throw new Error(f);
+ }
+ }
+ }
+ return i;
+ }
+}
+class Mn {
+ constructor(r) {
+ Ue(this, "options");
+ this.options = r || j0;
+ }
+ /**
+ * Process markdown before marked
+ */
+ preprocess(r) {
+ return r;
+ }
+ /**
+ * Process HTML after marked is finished
+ */
+ postprocess(r) {
+ return r;
+ }
+ /**
+ * Process all tokens before walk tokens
+ */
+ processAllTokens(r) {
+ return r;
+ }
+}
+Ue(Mn, "passThroughHooks", /* @__PURE__ */ new Set([
+ "preprocess",
+ "postprocess",
+ "processAllTokens"
+]));
+var zn, Os, vr, To;
+class Co {
+ constructor(...r) {
+ cs(this, zn);
+ cs(this, vr);
+ Ue(this, "defaults", Hs());
+ Ue(this, "options", this.setOptions);
+ Ue(this, "parse", rr(this, zn, Os).call(this, n0.lex, r0.parse));
+ Ue(this, "parseInline", rr(this, zn, Os).call(this, n0.lexInline, r0.parseInline));
+ Ue(this, "Parser", r0);
+ Ue(this, "Renderer", xr);
+ Ue(this, "TextRenderer", Xs);
+ Ue(this, "Lexer", n0);
+ Ue(this, "Tokenizer", _r);
+ Ue(this, "Hooks", Mn);
+ this.use(...r);
+ }
+ /**
+ * Run callback for every token
+ */
+ walkTokens(r, s) {
+ var o, u;
+ let i = [];
+ for (const f of r)
+ switch (i = i.concat(s.call(this, f)), f.type) {
+ case "table": {
+ const p = f;
+ for (const g of p.header)
+ i = i.concat(this.walkTokens(g.tokens, s));
+ for (const g of p.rows)
+ for (const y of g)
+ i = i.concat(this.walkTokens(y.tokens, s));
+ break;
+ }
+ case "list": {
+ const p = f;
+ i = i.concat(this.walkTokens(p.items, s));
+ break;
+ }
+ default: {
+ const p = f;
+ (u = (o = this.defaults.extensions) == null ? void 0 : o.childTokens) != null && u[p.type] ? this.defaults.extensions.childTokens[p.type].forEach((g) => {
+ const y = p[g].flat(1 / 0);
+ i = i.concat(this.walkTokens(y, s));
+ }) : p.tokens && (i = i.concat(this.walkTokens(p.tokens, s)));
+ }
+ }
+ return i;
+ }
+ use(...r) {
+ const s = this.defaults.extensions || { renderers: {}, childTokens: {} };
+ return r.forEach((i) => {
+ const o = { ...i };
+ if (o.async = this.defaults.async || o.async || !1, i.extensions && (i.extensions.forEach((u) => {
+ if (!u.name)
+ throw new Error("extension name required");
+ if ("renderer" in u) {
+ const f = s.renderers[u.name];
+ f ? s.renderers[u.name] = function(...p) {
+ let g = u.renderer.apply(this, p);
+ return g === !1 && (g = f.apply(this, p)), g;
+ } : s.renderers[u.name] = u.renderer;
+ }
+ if ("tokenizer" in u) {
+ if (!u.level || u.level !== "block" && u.level !== "inline")
+ throw new Error("extension level must be 'block' or 'inline'");
+ const f = s[u.level];
+ f ? f.unshift(u.tokenizer) : s[u.level] = [u.tokenizer], u.start && (u.level === "block" ? s.startBlock ? s.startBlock.push(u.start) : s.startBlock = [u.start] : u.level === "inline" && (s.startInline ? s.startInline.push(u.start) : s.startInline = [u.start]));
+ }
+ "childTokens" in u && u.childTokens && (s.childTokens[u.name] = u.childTokens);
+ }), o.extensions = s), i.renderer) {
+ const u = this.defaults.renderer || new xr(this.defaults);
+ for (const f in i.renderer) {
+ if (!(f in u))
+ throw new Error(`renderer '${f}' does not exist`);
+ if (f === "options")
+ continue;
+ const p = f, g = i.renderer[p], y = u[p];
+ u[p] = (...D) => {
+ let T = g.apply(u, D);
+ return T === !1 && (T = y.apply(u, D)), T || "";
+ };
+ }
+ o.renderer = u;
+ }
+ if (i.tokenizer) {
+ const u = this.defaults.tokenizer || new _r(this.defaults);
+ for (const f in i.tokenizer) {
+ if (!(f in u))
+ throw new Error(`tokenizer '${f}' does not exist`);
+ if (["options", "rules", "lexer"].includes(f))
+ continue;
+ const p = f, g = i.tokenizer[p], y = u[p];
+ u[p] = (...D) => {
+ let T = g.apply(u, D);
+ return T === !1 && (T = y.apply(u, D)), T;
+ };
+ }
+ o.tokenizer = u;
+ }
+ if (i.hooks) {
+ const u = this.defaults.hooks || new Mn();
+ for (const f in i.hooks) {
+ if (!(f in u))
+ throw new Error(`hook '${f}' does not exist`);
+ if (f === "options")
+ continue;
+ const p = f, g = i.hooks[p], y = u[p];
+ Mn.passThroughHooks.has(f) ? u[p] = (D) => {
+ if (this.defaults.async)
+ return Promise.resolve(g.call(u, D)).then((P) => y.call(u, P));
+ const T = g.call(u, D);
+ return y.call(u, T);
+ } : u[p] = (...D) => {
+ let T = g.apply(u, D);
+ return T === !1 && (T = y.apply(u, D)), T;
+ };
+ }
+ o.hooks = u;
+ }
+ if (i.walkTokens) {
+ const u = this.defaults.walkTokens, f = i.walkTokens;
+ o.walkTokens = function(p) {
+ let g = [];
+ return g.push(f.call(this, p)), u && (g = g.concat(u.call(this, p))), g;
+ };
+ }
+ this.defaults = { ...this.defaults, ...o };
+ }), this;
+ }
+ setOptions(r) {
+ return this.defaults = { ...this.defaults, ...r }, this;
+ }
+ lexer(r, s) {
+ return n0.lex(r, s ?? this.defaults);
+ }
+ parser(r, s) {
+ return r0.parse(r, s ?? this.defaults);
+ }
+}
+zn = new WeakSet(), Os = function(r, s) {
+ return (i, o) => {
+ const u = { ...o }, f = { ...this.defaults, ...u };
+ this.defaults.async === !0 && u.async === !1 && (f.silent || console.warn("marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored."), f.async = !0);
+ const p = rr(this, vr, To).call(this, !!f.silent, !!f.async);
+ if (typeof i > "u" || i === null)
+ return p(new Error("marked(): input parameter is undefined or null"));
+ if (typeof i != "string")
+ return p(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(i) + ", string expected"));
+ if (f.hooks && (f.hooks.options = f), f.async)
+ return Promise.resolve(f.hooks ? f.hooks.preprocess(i) : i).then((g) => r(g, f)).then((g) => f.hooks ? f.hooks.processAllTokens(g) : g).then((g) => f.walkTokens ? Promise.all(this.walkTokens(g, f.walkTokens)).then(() => g) : g).then((g) => s(g, f)).then((g) => f.hooks ? f.hooks.postprocess(g) : g).catch(p);
+ try {
+ f.hooks && (i = f.hooks.preprocess(i));
+ let g = r(i, f);
+ f.hooks && (g = f.hooks.processAllTokens(g)), f.walkTokens && this.walkTokens(g, f.walkTokens);
+ let y = s(g, f);
+ return f.hooks && (y = f.hooks.postprocess(y)), y;
+ } catch (g) {
+ return p(g);
+ }
+ };
+}, vr = new WeakSet(), To = function(r, s) {
+ return (i) => {
+ if (i.message += `
+Please report this to https://github.com/markedjs/marked.`, r) {
+ const o = "An error occurred:
" + kt(i.message + "", !0) + " ";
+ return s ? Promise.resolve(o) : o;
+ }
+ if (s)
+ return Promise.reject(i);
+ throw i;
+ };
+};
+const W0 = new Co();
+function Me(a, r) {
+ return W0.parse(a, r);
+}
+Me.options = Me.setOptions = function(a) {
+ return W0.setOptions(a), Me.defaults = W0.defaults, yo(Me.defaults), Me;
+};
+Me.getDefaults = Hs;
+Me.defaults = j0;
+Me.use = function(...a) {
+ return W0.use(...a), Me.defaults = W0.defaults, yo(Me.defaults), Me;
+};
+Me.walkTokens = function(a, r) {
+ return W0.walkTokens(a, r);
+};
+Me.parseInline = W0.parseInline;
+Me.Parser = r0;
+Me.parser = r0.parse;
+Me.Renderer = xr;
+Me.TextRenderer = Xs;
+Me.Lexer = n0;
+Me.lexer = n0.lex;
+Me.Tokenizer = _r;
+Me.Hooks = Mn;
+Me.parse = Me;
+Me.options;
+Me.setOptions;
+Me.use;
+Me.walkTokens;
+Me.parseInline;
+r0.parse;
+n0.lex;
+function Ch(a) {
+ if (typeof a == "function" && (a = {
+ highlight: a
+ }), !a || typeof a.highlight != "function")
+ throw new Error("Must provide highlight function");
+ return typeof a.langPrefix != "string" && (a.langPrefix = "language-"), {
+ async: !!a.async,
+ walkTokens(r) {
+ if (r.type !== "code")
+ return;
+ const s = jl(r.lang);
+ if (a.async)
+ return Promise.resolve(a.highlight(r.text, s, r.lang || "")).then(Xl(r));
+ const i = a.highlight(r.text, s, r.lang || "");
+ if (i instanceof Promise)
+ throw new Error("markedHighlight is not set to async but the highlight function is async. Set the async option to true on markedHighlight to await the async highlight function.");
+ Xl(r)(i);
+ },
+ renderer: {
+ code(r, s, i) {
+ const o = jl(s), u = o ? ` class="${a.langPrefix}${Zl(o)}"` : "";
+ return r = r.replace(/\n$/, ""), `${i ? r : Zl(r, !0)}
+
`;
+ }
+ }
+ };
+}
+function jl(a) {
+ return (a || "").match(/\S*/)[0];
+}
+function Xl(a) {
+ return (r) => {
+ typeof r == "string" && r !== a.text && (a.escaped = !0, a.text = r);
+ };
+}
+const Mo = /[&<>"']/, Th = new RegExp(Mo.source, "g"), zo = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, Mh = new RegExp(zo.source, "g"), zh = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'"
+}, Yl = (a) => zh[a];
+function Zl(a, r) {
+ if (r) {
+ if (Mo.test(a))
+ return a.replace(Th, Yl);
+ } else if (zo.test(a))
+ return a.replace(Mh, Yl);
+ return a;
+}
+const Bh = /[\0-\x1F!-,\.\/:-@\[-\^`\{-\xA9\xAB-\xB4\xB6-\xB9\xBB-\xBF\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0378\u0379\u037E\u0380-\u0385\u0387\u038B\u038D\u03A2\u03F6\u0482\u0530\u0557\u0558\u055A-\u055F\u0589-\u0590\u05BE\u05C0\u05C3\u05C6\u05C8-\u05CF\u05EB-\u05EE\u05F3-\u060F\u061B-\u061F\u066A-\u066D\u06D4\u06DD\u06DE\u06E9\u06FD\u06FE\u0700-\u070F\u074B\u074C\u07B2-\u07BF\u07F6-\u07F9\u07FB\u07FC\u07FE\u07FF\u082E-\u083F\u085C-\u085F\u086B-\u089F\u08B5\u08C8-\u08D2\u08E2\u0964\u0965\u0970\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09F2-\u09FB\u09FD\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF0-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B54\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B70\u0B72-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BF0-\u0BFF\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C7F\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D0D\u0D11\u0D45\u0D49\u0D4F-\u0D53\u0D58-\u0D5E\u0D64\u0D65\u0D70-\u0D79\u0D80\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF4-\u0E00\u0E3B-\u0E3F\u0E4F\u0E5A-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F01-\u0F17\u0F1A-\u0F1F\u0F2A-\u0F34\u0F36\u0F38\u0F3A-\u0F3D\u0F48\u0F6D-\u0F70\u0F85\u0F98\u0FBD-\u0FC5\u0FC7-\u0FFF\u104A-\u104F\u109E\u109F\u10C6\u10C8-\u10CC\u10CE\u10CF\u10FB\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u1360-\u137F\u1390-\u139F\u13F6\u13F7\u13FE-\u1400\u166D\u166E\u1680\u169B-\u169F\u16EB-\u16ED\u16F9-\u16FF\u170D\u1715-\u171F\u1735-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17D4-\u17D6\u17D8-\u17DB\u17DE\u17DF\u17EA-\u180A\u180E\u180F\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u1945\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DA-\u19FF\u1A1C-\u1A1F\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1AA6\u1AA8-\u1AAF\u1AC1-\u1AFF\u1B4C-\u1B4F\u1B5A-\u1B6A\u1B74-\u1B7F\u1BF4-\u1BFF\u1C38-\u1C3F\u1C4A-\u1C4C\u1C7E\u1C7F\u1C89-\u1C8F\u1CBB\u1CBC\u1CC0-\u1CCF\u1CD3\u1CFB-\u1CFF\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FBD\u1FBF-\u1FC1\u1FC5\u1FCD-\u1FCF\u1FD4\u1FD5\u1FDC-\u1FDF\u1FED-\u1FF1\u1FF5\u1FFD-\u203E\u2041-\u2053\u2055-\u2070\u2072-\u207E\u2080-\u208F\u209D-\u20CF\u20F1-\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F-\u215F\u2189-\u24B5\u24EA-\u2BFF\u2C2F\u2C5F\u2CE5-\u2CEA\u2CF4-\u2CFF\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D70-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E00-\u2E2E\u2E30-\u3004\u3008-\u3020\u3030\u3036\u3037\u303D-\u3040\u3097\u3098\u309B\u309C\u30A0\u30FB\u3100-\u3104\u3130\u318F-\u319F\u31C0-\u31EF\u3200-\u33FF\u4DC0-\u4DFF\u9FFD-\u9FFF\uA48D-\uA4CF\uA4FE\uA4FF\uA60D-\uA60F\uA62C-\uA63F\uA673\uA67E\uA6F2-\uA716\uA720\uA721\uA789\uA78A\uA7C0\uA7C1\uA7CB-\uA7F4\uA828-\uA82B\uA82D-\uA83F\uA874-\uA87F\uA8C6-\uA8CF\uA8DA-\uA8DF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA954-\uA95F\uA97D-\uA97F\uA9C1-\uA9CE\uA9DA-\uA9DF\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A-\uAA5F\uAA77-\uAA79\uAAC3-\uAADA\uAADE\uAADF\uAAF0\uAAF1\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB5B\uAB6A-\uAB6F\uABEB\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uE000-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB29\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBB2-\uFBD2\uFD3E-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFC-\uFDFF\uFE10-\uFE1F\uFE30-\uFE32\uFE35-\uFE4C\uFE50-\uFE6F\uFE75\uFEFD-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF3E\uFF40\uFF5B-\uFF65\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFFF]|\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDD3F\uDD75-\uDDFC\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEE1-\uDEFF\uDF20-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDF9F\uDFC4-\uDFC7\uDFD0\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56-\uDC5F\uDC77-\uDC7F\uDC9F-\uDCDF\uDCF3\uDCF6-\uDCFF\uDD16-\uDD1F\uDD3A-\uDD7F\uDDB8-\uDDBD\uDDC0-\uDDFF\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE40-\uDE5F\uDE7D-\uDE7F\uDE9D-\uDEBF\uDEC8\uDEE7-\uDEFF\uDF36-\uDF3F\uDF56-\uDF5F\uDF73-\uDF7F\uDF92-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCFF\uDD28-\uDD2F\uDD3A-\uDE7F\uDEAA\uDEAD-\uDEAF\uDEB2-\uDEFF\uDF1D-\uDF26\uDF28-\uDF2F\uDF51-\uDFAF\uDFC5-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC47-\uDC65\uDC70-\uDC7E\uDCBB-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD40-\uDD43\uDD48-\uDD4F\uDD74\uDD75\uDD77-\uDD7F\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDFF\uDE12\uDE38-\uDE3D\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEA9-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC4B-\uDC4F\uDC5A-\uDC5D\uDC62-\uDC7F\uDCC6\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDC1-\uDDD7\uDDDE-\uDDFF\uDE41-\uDE43\uDE45-\uDE4F\uDE5A-\uDE7F\uDEB9-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF3A-\uDFFF]|\uD806[\uDC3B-\uDC9F\uDCEA-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD44-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE2\uDDE5-\uDDFF\uDE3F-\uDE46\uDE48-\uDE4F\uDE9A-\uDE9C\uDE9E-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC41-\uDC4F\uDC5A-\uDC71\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF7-\uDFAF\uDFB1-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD824-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83D\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDECF\uDEEE\uDEEF\uDEF5-\uDEFF\uDF37-\uDF3F\uDF44-\uDF4F\uDF5A-\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE80-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE2\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82C[\uDD1F-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A-\uDC9C\uDC9F-\uDFFF]|\uD834[\uDC00-\uDD64\uDD6A-\uDD6C\uDD73-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDE41\uDE45-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3\uDFCC\uDFCD]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD4F-\uDEBF\uDEFA-\uDFFF]|\uD83A[\uDCC5-\uDCCF\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDFFF]|\uD83C[\uDC00-\uDD2F\uDD4A-\uDD4F\uDD6A-\uDD6F\uDD8A-\uDFFF]|\uD83E[\uDC00-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEDE-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]/g, Nh = Object.hasOwnProperty;
+class Bo {
+ /**
+ * Create a new slug class.
+ */
+ constructor() {
+ this.occurrences, this.reset();
+ }
+ /**
+ * Generate a unique slug.
+ *
+ * Tracks previously generated slugs: repeated calls with the same value
+ * will result in different slugs.
+ * Use the `slug` function to get same slugs.
+ *
+ * @param {string} value
+ * String of text to slugify
+ * @param {boolean} [maintainCase=false]
+ * Keep the current case, otherwise make all lowercase
+ * @return {string}
+ * A unique slug string
+ */
+ slug(r, s) {
+ const i = this;
+ let o = Rh(r, s === !0);
+ const u = o;
+ for (; Nh.call(i.occurrences, o); )
+ i.occurrences[u]++, o = u + "-" + i.occurrences[u];
+ return i.occurrences[o] = 0, o;
+ }
+ /**
+ * Reset - Forget all previous slugs
+ *
+ * @return void
+ */
+ reset() {
+ this.occurrences = /* @__PURE__ */ Object.create(null);
+ }
+}
+function Rh(a, r) {
+ return typeof a != "string" ? "" : (r || (a = a.toLowerCase()), a.replace(Bh, "").replace(/ /g, "-"));
+}
+let Kl, Ql = [];
+function Ih({ prefix: a = "" } = {}) {
+ return {
+ headerIds: !1,
+ // prevent deprecation warning; remove this once headerIds option is removed
+ hooks: {
+ preprocess(r) {
+ return Ql = [], Kl = new Bo(), r;
+ }
+ },
+ renderer: {
+ heading(r, s, i) {
+ i = i.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi, "");
+ const o = `${a}${Kl.slug(i)}`, u = { level: s, text: r, id: o };
+ return Ql.push(u), `${r}
+`;
+ }
+ }
+ };
+}
+var No = { exports: {} };
+(function(a) {
+ var r = typeof window < "u" ? window : typeof WorkerGlobalScope < "u" && self instanceof WorkerGlobalScope ? self : {};
+ /**
+ * Prism: Lightweight, robust, elegant syntax highlighting
+ *
+ * @license MIT
+ * @author Lea Verou
+ * @namespace
+ * @public
+ */
+ var s = function(i) {
+ var o = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i, u = 0, f = {}, p = {
+ /**
+ * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the
+ * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load
+ * additional languages or plugins yourself.
+ *
+ * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.
+ *
+ * You obviously have to change this value before the automatic highlighting started. To do this, you can add an
+ * empty Prism object into the global scope before loading the Prism script like this:
+ *
+ * ```js
+ * window.Prism = window.Prism || {};
+ * Prism.manual = true;
+ * // add a new
+
+
+
+
+ {#if loading_status}
+
+ {/if}
+
+ {#if show_label}
+
+ {/if}
+ gradio.dispatch("change", value)}
+ on:select={(e) => gradio.dispatch("select", e.detail)}
+ on:like={(e) => gradio.dispatch("like", e.detail)}
+ on:share={(e) => gradio.dispatch("share", e.detail)}
+ on:error={(e) => gradio.dispatch("error", e.detail)}
+ {avatar_images}
+ {sanitize_html}
+ {bubble_full_width}
+ {line_breaks}
+ {layout}
+ />
+
+
+
+
diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..234b2897f333990f24620dc8224382d7e09bc10a
--- /dev/null
+++ b/src/frontend/package-lock.json
@@ -0,0 +1,1560 @@
+{
+ "name": "gradio_multimodalchatbot",
+ "version": "0.7.6",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "gradio_multimodalchatbot",
+ "version": "0.7.6",
+ "license": "ISC",
+ "dependencies": {
+ "@gradio/atoms": "0.5.3",
+ "@gradio/audio": "0.9.6",
+ "@gradio/client": "0.13.0",
+ "@gradio/icons": "0.3.3",
+ "@gradio/image": "0.9.6",
+ "@gradio/markdown": "0.6.5",
+ "@gradio/statustracker": "0.4.8",
+ "@gradio/theme": "0.2.0",
+ "@gradio/upload": "0.7.7",
+ "@gradio/utils": "0.3.0",
+ "@gradio/video": "0.6.6",
+ "@types/dompurify": "^3.0.2",
+ "@types/katex": "^0.16.0",
+ "@types/prismjs": "1.26.3",
+ "dequal": "^2.0.2"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.24.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz",
+ "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
+ "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz",
+ "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz",
+ "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz",
+ "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz",
+ "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz",
+ "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz",
+ "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz",
+ "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz",
+ "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz",
+ "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz",
+ "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz",
+ "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
+ "cpu": [
+ "loong64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz",
+ "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
+ "cpu": [
+ "mips64el"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz",
+ "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz",
+ "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz",
+ "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
+ "cpu": [
+ "s390x"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz",
+ "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz",
+ "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz",
+ "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz",
+ "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz",
+ "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz",
+ "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz",
+ "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@ffmpeg/ffmpeg": {
+ "version": "0.12.10",
+ "resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.12.10.tgz",
+ "integrity": "sha512-lVtk8PW8e+NUzGZhPTWj2P1J4/NyuCrbDD3O9IGpSeLYtUZKBqZO8CNj1WYGghep/MXoM8e1qVY1GztTkf8YYQ==",
+ "dependencies": {
+ "@ffmpeg/types": "^0.12.2"
+ },
+ "engines": {
+ "node": ">=18.x"
+ }
+ },
+ "node_modules/@ffmpeg/types": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/@ffmpeg/types/-/types-0.12.2.tgz",
+ "integrity": "sha512-NJtxwPoLb60/z1Klv0ueshguWQ/7mNm106qdHkB4HL49LXszjhjCCiL+ldHJGQ9ai2Igx0s4F24ghigy//ERdA==",
+ "engines": {
+ "node": ">=16.x"
+ }
+ },
+ "node_modules/@ffmpeg/util": {
+ "version": "0.12.1",
+ "resolved": "https://registry.npmjs.org/@ffmpeg/util/-/util-0.12.1.tgz",
+ "integrity": "sha512-10jjfAKWaDyb8+nAkijcsi9wgz/y26LOc1NKJradNMyCIl6usQcBbhkjX5qhALrSBcOy6TOeksunTYa+a03qNQ==",
+ "engines": {
+ "node": ">=18.x"
+ }
+ },
+ "node_modules/@formatjs/ecma402-abstract": {
+ "version": "1.11.4",
+ "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz",
+ "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==",
+ "dependencies": {
+ "@formatjs/intl-localematcher": "0.2.25",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@formatjs/fast-memoize": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz",
+ "integrity": "sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@formatjs/icu-messageformat-parser": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz",
+ "integrity": "sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "1.11.4",
+ "@formatjs/icu-skeleton-parser": "1.3.6",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@formatjs/icu-skeleton-parser": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz",
+ "integrity": "sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "1.11.4",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@formatjs/intl-localematcher": {
+ "version": "0.2.25",
+ "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz",
+ "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@gradio/atoms": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/@gradio/atoms/-/atoms-0.5.3.tgz",
+ "integrity": "sha512-1HZgmhbAPzCYt6muyttrJi/P5zXTnD3kVMgneXuDd2j9qB21kSqzshmpnPcvDO3lO0vro55HuxgH22PJ1XHWqg==",
+ "dependencies": {
+ "@gradio/icons": "^0.3.3",
+ "@gradio/utils": "^0.3.0"
+ }
+ },
+ "node_modules/@gradio/audio": {
+ "version": "0.9.6",
+ "resolved": "https://registry.npmjs.org/@gradio/audio/-/audio-0.9.6.tgz",
+ "integrity": "sha512-IiSYjU6u2azexhP7YoqCddCox16V66qXiygd7ogCzMyjiujhLJj8aUvjUnjvS6l/DtQ8ZeTnjgVwMkdHGBWSzA==",
+ "dependencies": {
+ "@gradio/atoms": "^0.5.3",
+ "@gradio/button": "^0.2.25",
+ "@gradio/client": "^0.13.0",
+ "@gradio/icons": "^0.3.3",
+ "@gradio/statustracker": "^0.4.8",
+ "@gradio/upload": "^0.7.7",
+ "@gradio/utils": "^0.3.0",
+ "@gradio/wasm": "^0.8.0",
+ "@types/wavesurfer.js": "^6.0.10",
+ "extendable-media-recorder": "^9.0.0",
+ "extendable-media-recorder-wav-encoder": "^7.0.76",
+ "resize-observer-polyfill": "^1.5.1",
+ "svelte-range-slider-pips": "^2.0.1",
+ "wavesurfer.js": "^7.4.2"
+ }
+ },
+ "node_modules/@gradio/button": {
+ "version": "0.2.29",
+ "resolved": "https://registry.npmjs.org/@gradio/button/-/button-0.2.29.tgz",
+ "integrity": "sha512-XHT+t54rj0yLTb/ECiQvTgTaTP0Qli09GyJzvpGDpgtITIncQxoALiYiKnD5ys6wZSPWdSuwIglyIJ7rn0vkKg==",
+ "dependencies": {
+ "@gradio/client": "^0.15.0",
+ "@gradio/upload": "^0.8.3",
+ "@gradio/utils": "^0.3.0"
+ }
+ },
+ "node_modules/@gradio/button/node_modules/@gradio/atoms": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@gradio/atoms/-/atoms-0.6.1.tgz",
+ "integrity": "sha512-u7+cleKA0Et6AhEq5xTiaGIAYPR2He7/JSYcM3Sg+vkFOXhbJTPUnHLub+y9HiseheEmnZDGddFBr+RL5Jaxbg==",
+ "dependencies": {
+ "@gradio/icons": "^0.3.4",
+ "@gradio/utils": "^0.3.0"
+ }
+ },
+ "node_modules/@gradio/button/node_modules/@gradio/client": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@gradio/client/-/client-0.15.0.tgz",
+ "integrity": "sha512-WQtLRy7mZYR07UsriSLHh3E/zwv53LzQGVCeEz6ue4YwsqEgaDrDwKIGjnpkL06HaZ94Gy/dAvZvUDI4MCO62g==",
+ "dependencies": {
+ "bufferutil": "^4.0.7",
+ "semiver": "^1.1.0",
+ "ws": "^8.13.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@gradio/button/node_modules/@gradio/icons": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@gradio/icons/-/icons-0.3.4.tgz",
+ "integrity": "sha512-rtH7u3OiYy9UuO1bnebXkTXgc+D62H6BILrMtM4EfsKGgQQICD0n7NPvbPtS0zpi/fz0ppCdlfFIKKIOeVaeFg=="
+ },
+ "node_modules/@gradio/button/node_modules/@gradio/upload": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/@gradio/upload/-/upload-0.8.3.tgz",
+ "integrity": "sha512-rufkvHPn1CwEuo/dgDMbSdLAG6m5poTT0hyDYnqdRkIAeBi6gU73xPylKUdQcVBIJvYGexkTU83jij4pnet6yQ==",
+ "dependencies": {
+ "@gradio/atoms": "^0.6.1",
+ "@gradio/client": "^0.15.0",
+ "@gradio/icons": "^0.3.4",
+ "@gradio/upload": "^0.8.3",
+ "@gradio/utils": "^0.3.0",
+ "@gradio/wasm": "^0.10.0"
+ }
+ },
+ "node_modules/@gradio/button/node_modules/@gradio/wasm": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@gradio/wasm/-/wasm-0.10.0.tgz",
+ "integrity": "sha512-ephuiuimvMad6KzNPz/3OdnjgE5wsJdVfAAqu+J0qloetbH42LfeRLsVe5WqGo2WpjzXq5MC8I8MJ7lpQMhUpw==",
+ "dependencies": {
+ "@types/path-browserify": "^1.0.0",
+ "path-browserify": "^1.0.1"
+ }
+ },
+ "node_modules/@gradio/client": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@gradio/client/-/client-0.13.0.tgz",
+ "integrity": "sha512-TIkVkou3WvvPJIEasJ/JdR2F96OXfq8OkbChnkQLBtzuVHXuqfewqkDpK85Rw3lkPFofvp6jGrUGKd7imAq8ww==",
+ "dependencies": {
+ "bufferutil": "^4.0.7",
+ "semiver": "^1.1.0",
+ "ws": "^8.13.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@gradio/column": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@gradio/column/-/column-0.1.0.tgz",
+ "integrity": "sha512-P24nqqVnMXBaDA1f/zSN5HZRho4PxP8Dq+7VltPHlmxIEiZYik2AJ4J0LeuIha34FDO0guu/16evdrpvGIUAfw=="
+ },
+ "node_modules/@gradio/icons": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@gradio/icons/-/icons-0.3.3.tgz",
+ "integrity": "sha512-UFTHpjzFJVwaRzZsdslWxnKUPGgtVeErmUGzrG9di4Vn0oHn1FgHt1Yr2SVu4lO3JI/r2u3H49tb6iax4U9HjA=="
+ },
+ "node_modules/@gradio/image": {
+ "version": "0.9.6",
+ "resolved": "https://registry.npmjs.org/@gradio/image/-/image-0.9.6.tgz",
+ "integrity": "sha512-tFI9mRi0pradm+uqf1sSE0vRTKzklx923otbkj1RfqCmQ7f4M25pvYOcCpFALMVgMyUdAtjt86ARPsWyb4GS0w==",
+ "dependencies": {
+ "@gradio/atoms": "^0.5.3",
+ "@gradio/client": "^0.13.0",
+ "@gradio/icons": "^0.3.3",
+ "@gradio/statustracker": "^0.4.8",
+ "@gradio/upload": "^0.7.7",
+ "@gradio/utils": "^0.3.0",
+ "@gradio/wasm": "^0.8.0",
+ "cropperjs": "^1.5.12",
+ "lazy-brush": "^1.0.1",
+ "resize-observer-polyfill": "^1.5.1"
+ }
+ },
+ "node_modules/@gradio/markdown": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/@gradio/markdown/-/markdown-0.6.5.tgz",
+ "integrity": "sha512-ae/hZiRg28n8uRs8MWwrfFwsT2NC/TFil178aAiXekj/w+tyFM3ZNqRCCHLj5IAjD8qASN7swNUSmWPM7ix1Gw==",
+ "dependencies": {
+ "@gradio/atoms": "^0.5.3",
+ "@gradio/statustracker": "^0.4.8",
+ "@gradio/utils": "^0.3.0",
+ "@types/dompurify": "^3.0.2",
+ "@types/katex": "^0.16.0",
+ "@types/prismjs": "1.26.3",
+ "dompurify": "^3.0.3",
+ "github-slugger": "^2.0.0",
+ "katex": "^0.16.7",
+ "marked": "^12.0.0",
+ "marked-gfm-heading-id": "^3.1.2",
+ "marked-highlight": "^2.0.1",
+ "prismjs": "1.29.0"
+ }
+ },
+ "node_modules/@gradio/statustracker": {
+ "version": "0.4.8",
+ "resolved": "https://registry.npmjs.org/@gradio/statustracker/-/statustracker-0.4.8.tgz",
+ "integrity": "sha512-B/SN7T9BbcdzPrWYfKVxwy3e4u85MS+DAZSeuXgPbAL5n5QravCtvNW7zwkUWb0OlBloaglN3Y7K3M8l1hR5qg==",
+ "dependencies": {
+ "@gradio/atoms": "^0.5.3",
+ "@gradio/column": "^0.1.0",
+ "@gradio/icons": "^0.3.3",
+ "@gradio/utils": "^0.3.0"
+ }
+ },
+ "node_modules/@gradio/theme": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@gradio/theme/-/theme-0.2.0.tgz",
+ "integrity": "sha512-33c68Nk7oRXLn08OxPfjcPm7S4tXGOUV1I1bVgzdM2YV5o1QBOS1GEnXPZPu/CEYPePLMB6bsDwffrLEyLGWVQ=="
+ },
+ "node_modules/@gradio/upload": {
+ "version": "0.7.7",
+ "resolved": "https://registry.npmjs.org/@gradio/upload/-/upload-0.7.7.tgz",
+ "integrity": "sha512-U43AYVzlVieyHLgxZHLTwtnmja0n2IMY4q8REnsq9wP/lSYmbDMwanrkE6z7IJtRccc/qKriNUnJB02b2YIDtg==",
+ "dependencies": {
+ "@gradio/atoms": "^0.5.3",
+ "@gradio/client": "^0.13.0",
+ "@gradio/icons": "^0.3.3",
+ "@gradio/upload": "^0.7.7",
+ "@gradio/utils": "^0.3.0",
+ "@gradio/wasm": "^0.8.0"
+ }
+ },
+ "node_modules/@gradio/utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@gradio/utils/-/utils-0.3.0.tgz",
+ "integrity": "sha512-VxP0h7UoWazkdSB875ChvTXWamBwMguuRc+8OyQFZjdj14lcqLEQuj54es3FDBpXOp5GMLFh48Q5FLLjYxMgSg==",
+ "dependencies": {
+ "@gradio/theme": "^0.2.0",
+ "svelte-i18n": "^3.6.0"
+ }
+ },
+ "node_modules/@gradio/video": {
+ "version": "0.6.6",
+ "resolved": "https://registry.npmjs.org/@gradio/video/-/video-0.6.6.tgz",
+ "integrity": "sha512-n9vYKELXWWTUUAahNkX7x6tUP9XApdnMChcanIOvdOXiyOiprJRMb9wRuChbz+E3IeJyEVS+qfgGdkN6bEkuvw==",
+ "dependencies": {
+ "@ffmpeg/ffmpeg": "^0.12.7",
+ "@ffmpeg/util": "^0.12.1",
+ "@gradio/atoms": "^0.5.3",
+ "@gradio/client": "^0.13.0",
+ "@gradio/icons": "^0.3.3",
+ "@gradio/image": "^0.9.6",
+ "@gradio/statustracker": "^0.4.8",
+ "@gradio/upload": "^0.7.7",
+ "@gradio/utils": "^0.3.0",
+ "@gradio/wasm": "^0.8.0",
+ "mrmime": "^2.0.0"
+ }
+ },
+ "node_modules/@gradio/wasm": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@gradio/wasm/-/wasm-0.8.0.tgz",
+ "integrity": "sha512-JZTboZPBffyCfZoY88NiQFDaB83zE7euP5dGL3Qw7mESmo/WPBiPj5QTm+EJd/ttxsxngQwO9YbHlFe2XiMk8g==",
+ "dependencies": {
+ "@types/path-browserify": "^1.0.0",
+ "path-browserify": "^1.0.1"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "peer": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@types/debounce": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.4.tgz",
+ "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw=="
+ },
+ "node_modules/@types/dompurify": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz",
+ "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==",
+ "dependencies": {
+ "@types/trusted-types": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "peer": true
+ },
+ "node_modules/@types/katex": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz",
+ "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="
+ },
+ "node_modules/@types/path-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@types/path-browserify/-/path-browserify-1.0.2.tgz",
+ "integrity": "sha512-ZkC5IUqqIFPXx3ASTTybTzmQdwHwe2C0u3eL75ldQ6T9E9IWFJodn6hIfbZGab73DfyiHN4Xw15gNxUq2FbvBA=="
+ },
+ "node_modules/@types/prismjs": {
+ "version": "1.26.3",
+ "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.3.tgz",
+ "integrity": "sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw=="
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="
+ },
+ "node_modules/@types/wavesurfer.js": {
+ "version": "6.0.12",
+ "resolved": "https://registry.npmjs.org/@types/wavesurfer.js/-/wavesurfer.js-6.0.12.tgz",
+ "integrity": "sha512-oM9hYlPIVms4uwwoaGs9d0qp7Xk7IjSGkdwgmhUymVUIIilRfjtSQvoOgv4dpKiW0UozWRSyXfQqTobi0qWyCw==",
+ "dependencies": {
+ "@types/debounce": "*"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "peer": true,
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/automation-events": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/automation-events/-/automation-events-7.0.3.tgz",
+ "integrity": "sha512-5JhQDPpXvJLGgrDmr3xU9PX0ZxeJLZ1xJVkGmmRXkXNS/J9TSazLn/gu1s02qLI68RR40JpW6Uok9eaKtu4wBQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.2.0"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz",
+ "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==",
+ "peer": true,
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/broker-factory": {
+ "version": "3.0.96",
+ "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.0.96.tgz",
+ "integrity": "sha512-wztvXRl5EnmsWpU6tWJX9K3oNyAsU2QN3RiK7Gsxz+wmIYRD9VBn+n/hH5alUKtTUROdxgs/KlnMTEGJuHAd4g==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "fast-unique-numbers": "^9.0.3",
+ "tslib": "^2.6.2",
+ "worker-factory": "^7.0.23"
+ }
+ },
+ "node_modules/bufferutil": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz",
+ "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "node-gyp-build": "^4.3.0"
+ },
+ "engines": {
+ "node": ">=6.14.2"
+ }
+ },
+ "node_modules/cli-color": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz",
+ "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==",
+ "dependencies": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.64",
+ "es6-iterator": "^2.0.3",
+ "memoizee": "^0.4.15",
+ "timers-ext": "^0.1.7"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/code-red": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz",
+ "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15",
+ "@types/estree": "^1.0.1",
+ "acorn": "^8.10.0",
+ "estree-walker": "^3.0.3",
+ "periscopic": "^3.1.0"
+ }
+ },
+ "node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/cropperjs": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.6.1.tgz",
+ "integrity": "sha512-F4wsi+XkDHCOMrHMYjrTEE4QBOrsHHN5/2VsVAaRq8P7E5z7xQpT75S+f/9WikmBEailas3+yo+6zPIomW+NOA=="
+ },
+ "node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "peer": true,
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/d": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
+ "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+ "dependencies": {
+ "es5-ext": "^0.10.64",
+ "type": "^2.7.2"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/dompurify": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.11.tgz",
+ "integrity": "sha512-Fan4uMuyB26gFV3ovPoEoQbxRRPfTu3CvImyZnhGq5fsIEO+gEFLp45ISFt+kQBWsK5ulDdT0oV28jS1UrwQLg=="
+ },
+ "node_modules/es5-ext": {
+ "version": "0.10.64",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
+ "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.3",
+ "esniff": "^2.0.1",
+ "next-tick": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/es6-symbol": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
+ "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+ "dependencies": {
+ "d": "^1.0.2",
+ "ext": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/es6-weak-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
+ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.46",
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz",
+ "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.19.12",
+ "@esbuild/android-arm": "0.19.12",
+ "@esbuild/android-arm64": "0.19.12",
+ "@esbuild/android-x64": "0.19.12",
+ "@esbuild/darwin-arm64": "0.19.12",
+ "@esbuild/darwin-x64": "0.19.12",
+ "@esbuild/freebsd-arm64": "0.19.12",
+ "@esbuild/freebsd-x64": "0.19.12",
+ "@esbuild/linux-arm": "0.19.12",
+ "@esbuild/linux-arm64": "0.19.12",
+ "@esbuild/linux-ia32": "0.19.12",
+ "@esbuild/linux-loong64": "0.19.12",
+ "@esbuild/linux-mips64el": "0.19.12",
+ "@esbuild/linux-ppc64": "0.19.12",
+ "@esbuild/linux-riscv64": "0.19.12",
+ "@esbuild/linux-s390x": "0.19.12",
+ "@esbuild/linux-x64": "0.19.12",
+ "@esbuild/netbsd-x64": "0.19.12",
+ "@esbuild/openbsd-x64": "0.19.12",
+ "@esbuild/sunos-x64": "0.19.12",
+ "@esbuild/win32-arm64": "0.19.12",
+ "@esbuild/win32-ia32": "0.19.12",
+ "@esbuild/win32-x64": "0.19.12"
+ }
+ },
+ "node_modules/esniff": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
+ "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+ "dependencies": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.62",
+ "event-emitter": "^0.3.5",
+ "type": "^2.7.2"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
+ "node_modules/ext": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+ "dependencies": {
+ "type": "^2.7.2"
+ }
+ },
+ "node_modules/extendable-media-recorder": {
+ "version": "9.1.13",
+ "resolved": "https://registry.npmjs.org/extendable-media-recorder/-/extendable-media-recorder-9.1.13.tgz",
+ "integrity": "sha512-viHMp1CQEFZ2q3UL/8avsmO5pb2WHXApip7TKikrmmLeBgvayIllvp4yy4wkMbtOQODIkLZYhoniRa4SVYwjkQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "media-encoder-host": "^8.0.112",
+ "multi-buffer-data-view": "^6.0.3",
+ "recorder-audio-worklet": "^6.0.24",
+ "standardized-audio-context": "^25.3.68",
+ "subscribable-things": "^2.1.34",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/extendable-media-recorder-wav-encoder": {
+ "version": "7.0.108",
+ "resolved": "https://registry.npmjs.org/extendable-media-recorder-wav-encoder/-/extendable-media-recorder-wav-encoder-7.0.108.tgz",
+ "integrity": "sha512-KVGezaqWwTO7ukaypDjgrb8UXs07m1H7tr7nVy91I0Dd3CID58U4TYqKDB2gXmJP5vqUr8/n1mrPaNTToNq4wA==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "extendable-media-recorder-wav-encoder-broker": "^7.0.99",
+ "extendable-media-recorder-wav-encoder-worker": "^8.0.96",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/extendable-media-recorder-wav-encoder-broker": {
+ "version": "7.0.99",
+ "resolved": "https://registry.npmjs.org/extendable-media-recorder-wav-encoder-broker/-/extendable-media-recorder-wav-encoder-broker-7.0.99.tgz",
+ "integrity": "sha512-K5rL3Ry+qQRWObB4En5Eiw8NL3DBRp5ThrOxtmtpvrZnDEaIuYBlIpmg3LF9RrFLyMhstj3z6Rd8hsNRp9hP1Q==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "broker-factory": "^3.0.96",
+ "extendable-media-recorder-wav-encoder-worker": "^8.0.96",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/extendable-media-recorder-wav-encoder-worker": {
+ "version": "8.0.96",
+ "resolved": "https://registry.npmjs.org/extendable-media-recorder-wav-encoder-worker/-/extendable-media-recorder-wav-encoder-worker-8.0.96.tgz",
+ "integrity": "sha512-zj/QbGr0SQLMGZuHCiv7WY6dUm2fhIhNbau1llVQDDvZe1aaqd+IUGai1y3qYRv+yg3lWI644fXI+4wsRWvATw==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "tslib": "^2.6.2",
+ "worker-factory": "^7.0.23"
+ }
+ },
+ "node_modules/fast-unique-numbers": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.3.tgz",
+ "integrity": "sha512-Aq5qOCVsmjsJbrGr4bxA3v3P1yQGBSUV2OobO2mE6jbux8fMPYbJlSgfZyXiLCy+Lo1NaK6UtbN2CTBSBt+AvA==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.2.0"
+ }
+ },
+ "node_modules/github-slugger": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
+ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="
+ },
+ "node_modules/globalyzer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
+ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q=="
+ },
+ "node_modules/globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="
+ },
+ "node_modules/intl-messageformat": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-9.13.0.tgz",
+ "integrity": "sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "1.11.4",
+ "@formatjs/fast-memoize": "1.2.1",
+ "@formatjs/icu-messageformat-parser": "2.1.0",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/is-promise": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
+ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
+ },
+ "node_modules/is-reference": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
+ "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/katex": {
+ "version": "0.16.10",
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.10.tgz",
+ "integrity": "sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==",
+ "funding": [
+ "https://opencollective.com/katex",
+ "https://github.com/sponsors/katex"
+ ],
+ "dependencies": {
+ "commander": "^8.3.0"
+ },
+ "bin": {
+ "katex": "cli.js"
+ }
+ },
+ "node_modules/lazy-brush": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lazy-brush/-/lazy-brush-1.0.1.tgz",
+ "integrity": "sha512-xT/iSClTVi7vLoF8dCWTBhCuOWqsLXCMPa6ucVmVAk6hyNCM5JeS1NLhXqIrJktUg+caEYKlqSOUU4u3cpXzKg=="
+ },
+ "node_modules/locate-character": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
+ "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
+ "peer": true
+ },
+ "node_modules/lru-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
+ "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==",
+ "dependencies": {
+ "es5-ext": "~0.10.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz",
+ "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/marked": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.1.tgz",
+ "integrity": "sha512-Y1/V2yafOcOdWQCX0XpAKXzDakPOpn6U0YLxTJs3cww6VxOzZV1BTOOYWLvH3gX38cq+iLwljHHTnMtlDfg01Q==",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/marked-gfm-heading-id": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/marked-gfm-heading-id/-/marked-gfm-heading-id-3.1.3.tgz",
+ "integrity": "sha512-A0cRU4PCueX/5m8VE4mT8uTQ36l3xMYRojz3Eqnk4BmUFZ0T+9Xhn2KvHcANP4qbhfOeuMrWJCTQbASIBR5xeg==",
+ "dependencies": {
+ "github-slugger": "^2.0.0"
+ },
+ "peerDependencies": {
+ "marked": ">=4 <13"
+ }
+ },
+ "node_modules/marked-highlight": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.1.1.tgz",
+ "integrity": "sha512-ktdqwtBne8rim5mb+vvZ9FzElGFb+CHCgkx/g6DSzTjaSrVnxsJdSzB5YgCkknFrcOW+viocM1lGyIjC0oa3fg==",
+ "peerDependencies": {
+ "marked": ">=4 <13"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "peer": true
+ },
+ "node_modules/media-encoder-host": {
+ "version": "8.0.112",
+ "resolved": "https://registry.npmjs.org/media-encoder-host/-/media-encoder-host-8.0.112.tgz",
+ "integrity": "sha512-9zzaN3Jg6rAAcwPYYvJMmluLB27U/kF6aJRXW4z3c039p8htnTXUN8ZilA02XEKQdOibu0EHNeF4w/nEAcQgYQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "media-encoder-host-broker": "^7.0.101",
+ "media-encoder-host-worker": "^9.1.23",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/media-encoder-host-broker": {
+ "version": "7.0.101",
+ "resolved": "https://registry.npmjs.org/media-encoder-host-broker/-/media-encoder-host-broker-7.0.101.tgz",
+ "integrity": "sha512-lZ2jQelZK6omB5fc+AE87MHGFqdivAabuhf8trvcId4GTYXS7BQ2J+FDhpd5r9iVsfLAlOKyouC73NNthvVWfg==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "broker-factory": "^3.0.96",
+ "fast-unique-numbers": "^9.0.3",
+ "media-encoder-host-worker": "^9.1.23",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/media-encoder-host-worker": {
+ "version": "9.1.23",
+ "resolved": "https://registry.npmjs.org/media-encoder-host-worker/-/media-encoder-host-worker-9.1.23.tgz",
+ "integrity": "sha512-67s1Mu9irKwHRAYiaNJrDTJUsGrlwWrVhN9tNM47nieARli1ZPHtKJ39PV+Qgn5bfqK81UyHIVirN2xWd8i0oQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "extendable-media-recorder-wav-encoder-broker": "^7.0.99",
+ "tslib": "^2.6.2",
+ "worker-factory": "^7.0.23"
+ }
+ },
+ "node_modules/memoizee": {
+ "version": "0.4.15",
+ "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz",
+ "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==",
+ "dependencies": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.53",
+ "es6-weak-map": "^2.0.3",
+ "event-emitter": "^0.3.5",
+ "is-promise": "^2.2.2",
+ "lru-queue": "^0.1.0",
+ "next-tick": "^1.1.0",
+ "timers-ext": "^0.1.7"
+ }
+ },
+ "node_modules/mri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz",
+ "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/multi-buffer-data-view": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/multi-buffer-data-view/-/multi-buffer-data-view-6.0.3.tgz",
+ "integrity": "sha512-QxvFlGmLwLBkHfOvj+eUIAzTPFS3vuEAHsH7JJR7e8/VreLeUkC8lLfofOoIdm5u8BHEelMzh/6U/Zw6urFWEw==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.2.0"
+ }
+ },
+ "node_modules/next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+ },
+ "node_modules/node-gyp-build": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz",
+ "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==",
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
+ },
+ "node_modules/periscopic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
+ "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^3.0.0",
+ "is-reference": "^3.0.0"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/recorder-audio-worklet": {
+ "version": "6.0.24",
+ "resolved": "https://registry.npmjs.org/recorder-audio-worklet/-/recorder-audio-worklet-6.0.24.tgz",
+ "integrity": "sha512-ViX/TBwggm3YpRLLdR71+vbgOjHc9iEMXgV7ct46B3QexZ8Z+sPeuYiwc1Sxu3oALfPhvhKddrie3HqH8AXwCA==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "broker-factory": "^3.0.96",
+ "fast-unique-numbers": "^9.0.3",
+ "recorder-audio-worklet-processor": "^5.0.17",
+ "standardized-audio-context": "^25.3.68",
+ "subscribable-things": "^2.1.34",
+ "tslib": "^2.6.2",
+ "worker-factory": "^7.0.23"
+ }
+ },
+ "node_modules/recorder-audio-worklet-processor": {
+ "version": "5.0.17",
+ "resolved": "https://registry.npmjs.org/recorder-audio-worklet-processor/-/recorder-audio-worklet-processor-5.0.17.tgz",
+ "integrity": "sha512-5mtOpnpwyLcjUCicC88pDEpC+X7Ex/4kVqR0r+cAsmfRrMRbveaDe32mP/1RuZIuRk6bhuBndFC0XX8MatF9MA==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ },
+ "node_modules/resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
+ "node_modules/rxjs-interop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/rxjs-interop/-/rxjs-interop-2.0.0.tgz",
+ "integrity": "sha512-ASEq9atUw7lualXB+knvgtvwkCEvGWV2gDD/8qnASzBkzEARZck9JAyxmY8OS6Nc1pCPEgDTKNcx+YqqYfzArw=="
+ },
+ "node_modules/sade": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
+ "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
+ "dependencies": {
+ "mri": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/semiver": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz",
+ "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/standardized-audio-context": {
+ "version": "25.3.68",
+ "resolved": "https://registry.npmjs.org/standardized-audio-context/-/standardized-audio-context-25.3.68.tgz",
+ "integrity": "sha512-XxVOFwlnU3Rq7mfTpxRhuwgDf00HmG4GzpSRQcMwgoXLa+k/9n8HT9dpsLZt0A1YH+hO/kLxaBMOIv5fKV/Gcg==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "automation-events": "^7.0.3",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/subscribable-things": {
+ "version": "2.1.34",
+ "resolved": "https://registry.npmjs.org/subscribable-things/-/subscribable-things-2.1.34.tgz",
+ "integrity": "sha512-lQ+yAXc4XvQT/GyGh/Nlo0lFHXBK5teLW/FTFrbmmKX/DtMqpd7TPlsdNSIvV6EHuqhQoehdhNYMqDoN89WQ8A==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "rxjs-interop": "^2.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/svelte": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.12.tgz",
+ "integrity": "sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==",
+ "peer": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.15",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/estree": "^1.0.1",
+ "acorn": "^8.9.0",
+ "aria-query": "^5.3.0",
+ "axobject-query": "^4.0.0",
+ "code-red": "^1.0.3",
+ "css-tree": "^2.3.1",
+ "estree-walker": "^3.0.3",
+ "is-reference": "^3.0.1",
+ "locate-character": "^3.0.0",
+ "magic-string": "^0.30.4",
+ "periscopic": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/svelte-i18n": {
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/svelte-i18n/-/svelte-i18n-3.7.4.tgz",
+ "integrity": "sha512-yGRCNo+eBT4cPuU7IVsYTYjxB7I2V8qgUZPlHnNctJj5IgbJgV78flsRzpjZ/8iUYZrS49oCt7uxlU3AZv/N5Q==",
+ "dependencies": {
+ "cli-color": "^2.0.3",
+ "deepmerge": "^4.2.2",
+ "esbuild": "^0.19.2",
+ "estree-walker": "^2",
+ "intl-messageformat": "^9.13.0",
+ "sade": "^1.8.1",
+ "tiny-glob": "^0.2.9"
+ },
+ "bin": {
+ "svelte-i18n": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "peerDependencies": {
+ "svelte": "^3 || ^4"
+ }
+ },
+ "node_modules/svelte-i18n/node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/svelte-range-slider-pips": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/svelte-range-slider-pips/-/svelte-range-slider-pips-2.3.1.tgz",
+ "integrity": "sha512-P29PNqHld+SiaDuHzf98rLvhSYWXb3TVL9p7U5RG9UX8emUgypZgp9zuIIwpmIXysGQC6JG8duMc5FuaPnSVdg=="
+ },
+ "node_modules/timers-ext": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
+ "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
+ "dependencies": {
+ "es5-ext": "~0.10.46",
+ "next-tick": "1"
+ }
+ },
+ "node_modules/tiny-glob": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
+ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
+ "dependencies": {
+ "globalyzer": "0.1.0",
+ "globrex": "^0.1.2"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ },
+ "node_modules/type": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
+ "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
+ },
+ "node_modules/wavesurfer.js": {
+ "version": "7.7.8",
+ "resolved": "https://registry.npmjs.org/wavesurfer.js/-/wavesurfer.js-7.7.8.tgz",
+ "integrity": "sha512-uzpe+wOe031G03wC4P/LO7Ai9OkF7Wyh8QGn9IMjAbwtiwK+H083cOZij9S4SD/vEdTdXligFKvziSB9bVmaIg=="
+ },
+ "node_modules/worker-factory": {
+ "version": "7.0.23",
+ "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.23.tgz",
+ "integrity": "sha512-MqNAajaUNlfqlnj6S/vjN/eWdKfDodeEYwoi0ZDAmYeqFLVRaGuxIaXaAhtK+7cD4JtK9j6Y5h2nHoOYjSp5tg==",
+ "dependencies": {
+ "@babel/runtime": "^7.24.1",
+ "fast-unique-numbers": "^9.0.3",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
+ "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/src/frontend/package.json b/src/frontend/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..fe349bc6ca116715dec214cf2a0ed4117ee5c582
--- /dev/null
+++ b/src/frontend/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "gradio_multimodalchatbot",
+ "version": "0.7.6",
+ "description": "Gradio UI packages",
+ "type": "module",
+ "author": "",
+ "license": "ISC",
+ "private": false,
+ "dependencies": {
+ "@gradio/atoms": "0.5.3",
+ "@gradio/audio": "0.9.6",
+ "@gradio/client": "0.13.0",
+ "@gradio/icons": "0.3.3",
+ "@gradio/image": "0.9.6",
+ "@gradio/markdown": "0.6.5",
+ "@gradio/statustracker": "0.4.8",
+ "@gradio/theme": "0.2.0",
+ "@gradio/upload": "0.7.7",
+ "@gradio/utils": "0.3.0",
+ "@gradio/video": "0.6.6",
+ "@types/dompurify": "^3.0.2",
+ "@types/katex": "^0.16.0",
+ "@types/prismjs": "1.26.3",
+ "dequal": "^2.0.2"
+ },
+ "main_changeset": true,
+ "main": "./Index.svelte",
+ "exports": {
+ ".": "./Index.svelte",
+ "./package.json": "./package.json"
+ }
+}
\ No newline at end of file
diff --git a/src/frontend/shared/ChatBot.svelte b/src/frontend/shared/ChatBot.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..b8f0262d828af4b841a3d1f95df35de598c9e142
--- /dev/null
+++ b/src/frontend/shared/ChatBot.svelte
@@ -0,0 +1,582 @@
+
+
+{#if show_share_button && value !== null && value.length > 0}
+
+
+
+{/if}
+
+
+
+ {#if value !== null}
+ {#each value as message_pair, i}
+ {#each message_pair as message, j}
+ {#if message !== null}
+
+ {#if avatar_images[j] !== null}
+
+
+
+ {/if}
+
+
+
handle_select(i, j, message)}
+ on:keydown={(e) => {
+ if (e.key === "Enter") {
+ handle_select(i, j, message);
+ }
+ }}
+ dir={rtl ? "rtl" : "ltr"}
+ aria-label={(j == 0 ? "user" : "bot") +
+ "'s message: " +
+ (typeof message === "string"
+ ? message
+ : `a file of type ${message.file?.mime_type}, ${
+ message.file?.alt_text ??
+ message.file?.orig_name ??
+ ""
+ }`)}
+ >
+
+ {#each message.files as file, k}
+ {#if file !== null && file.file.mime_type?.includes("audio")}
+
+ {:else if message !== null && file.file?.mime_type?.includes("video")}
+
+
+
+ {:else if message !== null && file.file?.mime_type?.includes("image")}
+
+ {:else if message !== null && file.file?.url !== null}
+
+ {file.file?.orig_name || file.file?.path}
+
+ {:else if pending_message && j === 1}
+
+ {/if}
+ {/each}
+
+
+ {#if (likeable && j !== 0) || (show_copy_button && message && typeof message === "string")}
+
+ {#if likeable && j == 1}
+
+ handle_like(i, j, message, selected)}
+ />
+ {/if}
+ {#if show_copy_button && message && typeof message === "string"}
+
+ {/if}
+
+ {/if}
+
+ {/if}
+ {/each}
+ {/each}
+ {#if pending_message}
+
+ {/if}
+ {/if}
+
+
+
+
diff --git a/src/frontend/shared/Copy.svelte b/src/frontend/shared/Copy.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..45aec21732f81b12588b83617928986c1d5625f7
--- /dev/null
+++ b/src/frontend/shared/Copy.svelte
@@ -0,0 +1,79 @@
+
+
+
+ {#if !copied}
+
+ {/if}
+ {#if copied}
+
+ {/if}
+
+
+
diff --git a/src/frontend/shared/LikeDislike.svelte b/src/frontend/shared/LikeDislike.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..46843a40bdfc9fbe79e5e6333582b6098f47ff3e
--- /dev/null
+++ b/src/frontend/shared/LikeDislike.svelte
@@ -0,0 +1,46 @@
+
+
+ {
+ selected = "like";
+ handle_action(selected);
+ }}
+ aria-label={selected === "like" ? "clicked like" : "like"}
+>
+
+
+
+ {
+ selected = "dislike";
+ handle_action(selected);
+ }}
+ aria-label={selected === "dislike" ? "clicked dislike" : "dislike"}
+>
+
+
+
+
diff --git a/src/frontend/shared/Pending.svelte b/src/frontend/shared/Pending.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..8c688e9fcca66630eaee8d76c0d835d3b141ea16
--- /dev/null
+++ b/src/frontend/shared/Pending.svelte
@@ -0,0 +1,60 @@
+
+
+
+
Loading content
+
+
+
+
+
+
+
+
diff --git a/src/frontend/shared/autorender.d.ts b/src/frontend/shared/autorender.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..946e678e94e682f47568ac2863fabe280b7788c4
--- /dev/null
+++ b/src/frontend/shared/autorender.d.ts
@@ -0,0 +1 @@
+declare module "katex/dist/contrib/auto-render.js";
diff --git a/src/frontend/shared/utils.ts b/src/frontend/shared/utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..184036e2b34f42b08959775099b74bc26e124e6a
--- /dev/null
+++ b/src/frontend/shared/utils.ts
@@ -0,0 +1,68 @@
+import type { FileData } from "@gradio/client";
+import { uploadToHuggingFace } from "@gradio/utils";
+
+export type FileMessage = {
+ file: FileData;
+ alt_text?: string;
+};
+
+
+export type MultimodalMessage = {
+ text: string;
+ files?: FileMessage[];
+}
+
+export const format_chat_for_sharing = async (
+ chat: [string | FileData | null, string | FileData | null][]
+): Promise => {
+ let messages = await Promise.all(
+ chat.map(async (message_pair) => {
+ return await Promise.all(
+ message_pair.map(async (message, i) => {
+ if (message === null) return "";
+ let speaker_emoji = i === 0 ? "😃" : "🤖";
+ let html_content = "";
+
+ if (typeof message === "string") {
+ const regexPatterns = {
+ audio: / |!\[.*?\]\((\/file=.*?)\)/g
+ };
+
+ html_content = message;
+
+ for (let [_, regex] of Object.entries(regexPatterns)) {
+ let match;
+
+ while ((match = regex.exec(message)) !== null) {
+ const fileUrl = match[1] || match[2];
+ const newUrl = await uploadToHuggingFace(fileUrl, "url");
+ html_content = html_content.replace(fileUrl, newUrl);
+ }
+ }
+ } else {
+ if (!message?.url) return "";
+ const file_url = await uploadToHuggingFace(message.url, "url");
+ if (message.mime_type?.includes("audio")) {
+ html_content = ` `;
+ } else if (message.mime_type?.includes("video")) {
+ html_content = file_url;
+ } else if (message.mime_type?.includes("image")) {
+ html_content = ` `;
+ }
+ }
+
+ return `${speaker_emoji}: ${html_content}`;
+ })
+ );
+ })
+ );
+ return messages
+ .map((message_pair) =>
+ message_pair.join(
+ message_pair[0] !== "" && message_pair[1] !== "" ? "\n" : ""
+ )
+ )
+ .join("\n");
+};
diff --git a/src/pyproject.toml b/src/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..bfea15949d747ead90fdb22440f5add2f67fe37c
--- /dev/null
+++ b/src/pyproject.toml
@@ -0,0 +1,42 @@
+[build-system]
+requires = [
+ "hatchling",
+ "hatch-requirements-txt",
+ "hatch-fancy-pypi-readme>=22.5.0",
+]
+build-backend = "hatchling.build"
+
+[project]
+name = "gradio_awsbr_mmchatbot"
+version = "0.0.2"
+description = "This component enables multi-modal input for the Anthropic Claude v3 suite of models available from Amazon Bedrock"
+readme = "README.md"
+license = "MIT"
+requires-python = ">=3.8"
+authors = [{ name = "Jedijamez", email = "" }]
+keywords = ["gradio-custom-component", "gradio-template-Chatbot", "AWS", "Bedrock", "Amazon Bedrock", "Anthropic", "LLM", "Chatbot", "Multimodal", "Claude", "Claude v3"]
+# Add dependencies here
+dependencies = ["gradio>=4.0,<5.0"]
+classifiers = [
+ 'Development Status :: 3 - Alpha',
+ 'License :: OSI Approved :: Apache Software License',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3 :: Only',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: 3.11',
+ 'Topic :: Scientific/Engineering',
+ 'Topic :: Scientific/Engineering :: Artificial Intelligence',
+ 'Topic :: Scientific/Engineering :: Visualization',
+]
+
+[project.optional-dependencies]
+dev = ["build", "twine"]
+
+[tool.hatch.build]
+artifacts = ["/backend/gradio_multimodalchatbot/templates", "*.pyi", "backend/gradio_multimodalchatbot/templates", "backend/gradio_multimodalchatbot/templates", "backend/gradio_multimodalchatbot/templates", "backend/gradio_multimodalchatbot/templates", "backend/gradio_multimodalchatbot/templates", "backend/gradio_multimodalchatbot/templates", "backend/gradio_multimodalchatbot/templates", "backend/gradio_multimodalchatbot/templates", "backend/gradio_awsbr_mmchatbot/templates", "backend/gradio_awsbr_mmchatbot/templates", "backend/gradio_awsbr_mmchatbot/templates", "backend/gradio_awsbr_mmchatbot/templates", "backend/gradio_awsbr_mmchatbot/templates", "backend/gradio_awsbr_mmchatbot/templates", "backend/gradio_awsbr_mmchatbot/templates", "backend/gradio_awsbr_mmchatbot/templates", "backend/gradio_awsbr_mmchatbot/templates"]
+
+[tool.hatch.build.targets.wheel]
+packages = ["/backend/gradio_multimodalchatbot"]